Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.07;
Скачать: CL | DM;

Вниз

Может кто подскажет   Найти похожие ветки 

 
AndOrXor   (2002-09-10 09:11) [0]

Отправляю данные с клиента (TClientSocket) на сервер (TServerSocket). Ланные больших размеров - 100Мб. Если на одной машине, то все нормально передается. Сервер перенашу на другую машину и сного отправляю. Все валится. На маленьких размерах нормально работает. Не могу разобраться в чем глюк. Если ставлю принемать с breakpoint-м, то все нормально приходит. 8(


 
VID ©   (2002-09-10 09:40) [1]


> Все валится


Сервер выгружается из ОЗУ ? Или клиент ? BreakPoints для сервера или для клиента ?

Код ServerOnClientRead, ServerOnClientError, ClientOnError, ServerOnClientDisconnect, ClientOnDisconnect - неплохо было б посмотреть что там...
а так же код, где реализуется отправка данных от клиента к серверу.


 
AndOrXor   (2002-09-10 10:13) [2]

эээ, достаточно сложно будет разобраться. Сильно намутил 8) Мне кажется что можно и попроще сделать. Буду очень рад, если подскажете как сделать.
Короче, для каждого приконнектившегося пользователя создается новый объект класса TClientDesc, он умеет хранить принятые данные конкретного пользователя и в нем хранится сокет-хэндл пользователя. Данные хранятся в так называемом пакете. У каждого пользователя из может быть сколько угодно. Для каждого пользователя образуется список принятых пакетов. У пакета есть заголовок с описанием. Первые 4 байта - длина пакета.

//Reciev на сервере
void __fastcall TSSocket::Receive(TObject *Sender,TCustomWinSocket *Socket)
{
bool bRunHandler = false; //разрешение на запуск обработчика принятых данных

TClientDesc* pUser = HandleToUser(Socket->SocketHandle); //по хэндэлу сокета получаем указатель на пользователя

if (pUser == NULL)
{
GO()->Log->Error("Soc: Ошибка сервера");
return;
}

void * pdBuffer = new(char[Socket->ReceiveLength()]); //формируем буфер для пришедших данных

int iActualBytesReceived = Socket->ReceiveBuf(pdBuffer, Socket->ReceiveLength()); //копируем пришедшие данные в буфер

if(iActualBytesReceived == -1) return;

int iOffSet = 0;

do
{
int iFull = pUser->LenCurrent + iActualBytesReceived; //если последний пакет пришел полностью, то LenCurrent вернет 0, иначе колличество байт которые уже записаны

if(!pUser->LenCommon) //Если до этого все данные были приняты полностью, то LenCommon = 0, иначе длину последнего недозаписанного пакета
{
pUser->LenCommon = *(int*)((char*)pdBuffer+iOffSet); //получаем длину нового пакета (тут я делую опущение, что пришло >= 4 байт
}

TPacket *pPacket = pUser->Current; //получаем указатель на последний пакет, если до этого пришли все данные то возвращается указатель на новый пакет

if(pUser->LenCommon <= iFull) //если длина последнего недозаписанного пакета < чем колличество уже записанных данных + колличество пришедших, то
{
int iRemainder = pUser->LenCommon - pUser->LenCurrent; //Высчитываем разницу сколько необходимо дозаписать

pPacket->WritePacket((char*)pdBuffer+iOffSet,iRemainder);//дозаписываем в пакет найденную разницу

iOffSet += iRemainder; //делаем смешение на колличество дозаписанных данных

iActualBytesReceived -= iRemainder; // вычитаем из колличиства принятых длину куска которую мы записали

//пакет дозаписан, сбрасываем общую длину и последню записанныу длину в 0
pUser->LenCommon = 0; //
pUser->LenCurrent = 0;
//данные приняты, разрешем их обработку
bRunHandler = true;
}
else
{
//если данных (которые уже записаны в пакет + которые пришли) пришло меньше чем длина пакета, то их просто дозаписываем
pPacket->WritePacket((char*)pdBuffer+iOffSet,iActualBytesReceived);

pUser->LenCurrent = iFull;

iActualBytesReceived = 0;
}
}while(iActualBytesReceived);

delete pdBuffer;


if (bRunHandler && !pUser->Run) //Если разрешен запуск обработчиков и никакой из обработчиков в данный момент не запущен
{
pUser->Run = true; //ставим флаг что обработчик запущен

while(!pUser->Border) //Перебираем все пакеты которые стоят в очереди на обрабоку до граничного
{
TPacket *pPacket = pUser->Items;

try
{
NMOwner->FilterOfPackages(pPacket, this, Socket->SocketHandle); //запускаем обработчик
}
catch (...)
{
GO()->Log->InternalError("обработчик не найден " + IntToStr(pPacket->ToHandlerID));

delete pPacket;
}

delete pPacket;
}

pUser->Run = false;
}
}


 
cyborg ©   (2002-09-10 11:08) [3]

Можно спросить?
Что, Си-шные сайты "Атцтой", раз вы сюда это пишите?


 
VID ©   (2002-09-10 16:17) [4]

to AndOrXor: вообще я тоже для каждого клиента в своём сервере создаю TClientDataObj с поляим ReceivedPacket и SocketHandle...
Только вот C я не знаю...



Страницы: 1 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
6-21728
Vitas2
2002-09-07 15:04
2002.11.07
Internet


1-21594
Maloi
2002-10-29 18:31
2002.11.07
Люди! Не подскажите, есть ли такая функция которая выдает по типу


1-21561
Tornado
2002-10-29 09:02
2002.11.07
Изменение размеров формы


1-21568
Di_wind
2002-10-25 23:00
2002.11.07
WebBrowser


1-21500
Semion
2002-10-25 06:25
2002.11.07
каталог