Форум: "Сети";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизПроблема с ServerSocket Найти похожие ветки
← →
alexa14 (2006-05-30 13:38) [0]Пишу сервер под IChat. Появилась поблема: данные доходят до клиента через раз.
Делаю всё так:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Len: integer;
begin
Len := socket.ReceiveBuf(Buf,65384);
ProcessData(buf,len); //отправляем на обработку
end;
procedure ProcessData(sData: array of char; Len: integer);
begin
//здесь разделяем склееные пакеты, расшифровываем сообщение
...........
//отправляем ответ клиенту
form1.ServerSocket1.Socket.Connections[x].SendBuf(sData,newLen);
end;
Что здесь может быть не то?
Может ServerSocket не успевает обрабатывать большое кол-во пакетов и некоторые из них теряются?
← →
Сергей М. © (2006-05-30 14:10) [1]SendBuf() - это функциональный метод.
Ты разницу между функциональным и процедурным методом понимаешь ?
← →
alexa14 (2006-05-30 14:15) [2]функциональный возвращает значение. А что в коде неправильно?
← →
Сергей М. © (2006-05-30 16:33) [3]
> А что в коде неправильно?
То и неправильно, что ты игнорируешь это самое возвращаемое значение.
А ведь оно о многом говорит !
← →
alexa14 (2006-05-30 18:08) [4]Если я не ошибаюсь, она возвращает кол-во отправленных данных. Как мне это поможет определить причину того, что не доходят данные?
← →
alexa14 (2006-05-30 20:42) [5]И ещё одна проблема появилась: не передаются последние 8 байт данных.
← →
Сергей М. © (2006-05-31 08:31) [6]
> Если я не ошибаюсь, она возвращает кол-во отправленных данных
Не нужно делать умозрительных заключений.
Следует внимательно прочитать справку и вникнуть в то что там написано.
Информация к размышлению - SendBuf() может вернуть -1 ....
← →
medved_68 © (2006-05-31 09:27) [7]
> alexa14
Вообще то сервер точно должен знать какой объем данных передает клиент
Соответственно клиент должен следить сколько он отправил серверу и если SendBuf() вернет -1 значит надо повторить передачу этого блока ибо сокет занят Если не отслеживать процесс то на выходе на сервере получишь кашу
Соответственно если пользуешься SendBuf() продумай протокол типа размер блока-пауза-сам блок данных-(если нужно)-квитирование приема блока. И при передаче самого блока данных методом SendBuf() тоже надо отслеживать сколько ушло в сокет и делать поправку
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c