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

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1159904904
Lelja
2006-10-03 23:48
2006.10.22
размещение справки в проге


9-1137705694
ZilonAtakuit
2006-01-20 00:21
2006.10.22
Прозрачность, текстура


2-1160116351
Alex_C
2006-10-06 10:32
2006.10.22
Еще вопрос по SynEdit


2-1160244953
learner
2006-10-07 22:15
2006.10.22
Аналог SysErrorMessage для NTSTATUS.


3-1156831947
worldmen
2006-08-29 10:12
2006.10.22
Список алиасов из BDE.