Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.043 c
6-1147666748
lka
2006-05-15 08:19
2006.10.22
Обзор компьютеров в домене, GetObject


15-1159434063
NailMan
2006-09-28 13:01
2006.10.22
Разыскивается описалово...


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


11-1135948023
homm
2005-12-30 16:07
2006.10.22
Как получить видимый регион окна?


15-1159179702
wl
2006-09-25 14:21
2006.10.22
глюки форума?




   Наверх