![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с ServerSocket [D7, WinXP]
alexa14 © (2006-05-30 13:38:00)Пишу сервер под 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 не успевает обрабатывать большое кол-во пакетов и некоторые из них теряются?
medved_68 (2006-05-31 09:27:00) [1]
> alexa14
Вообще то сервер точно должен знать какой объем данных передает клиент
Соответственно клиент должен следить сколько он отправил серверу и если SendBuf() вернет -1 значит надо повторить передачу этого блока ибо сокет занят Если не отслеживать процесс то на выходе на сервере получишь кашу
Соответственно если пользуешься SendBuf() продумай протокол типа размер блока-пауза-сам блок данных-(если нужно)-квитирование приема блока. И при передаче самого блока данных методом SendBuf() тоже надо отслеживать сколько ушло в сокет и делать поправку
Сергей М. (2006-05-31 08:31:00) [2]
> Если я не ошибаюсь, она возвращает кол-во отправленных данных
Не нужно делать умозрительных заключений.
Следует внимательно прочитать справку и вникнуть в то что там написано.
Информация к размышлению - SendBuf() может вернуть -1 ....
alexa14 (2006-05-30 20:42:00) [3]И ещё одна проблема появилась: не передаются последние 8 байт данных.
alexa14 (2006-05-30 18:08:00) [4]Если я не ошибаюсь, она возвращает кол-во отправленных данных. Как мне это поможет определить причину того, что не доходят данные?
Сергей М. (2006-05-30 16:33:00) [5]
> А что в коде неправильно?
То и неправильно, что ты игнорируешь это самое возвращаемое значение.
А ведь оно о многом говорит !
alexa14 (2006-05-30 14:15:00) [6]функциональный возвращает значение. А что в коде неправильно?
Сергей М. (2006-05-30 14:10:00) [7]SendBuf() - это функциональныйметод.
Ты разницу между функциональным и процедурным методом понимаешь ?