Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
1-21598
lovres
2002-10-30 12:03
2002.11.07
Подскажите маску для положительного вещественного числа?


7-21825
Dj Karies
2002-09-04 10:51
2002.11.07
Потоки


1-21661
^Sanya
2002-10-27 21:22
2002.11.07
MDI: как узнать, создан ли ребёнок, или нет - без цикла перебора?


4-21874
FilSM
2002-09-25 18:11
2002.11.07
Определение IP адреса


1-21559
_Saha_
2002-10-29 10:55
2002.11.07
ламерский вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский