Вниз
Скачать: 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.031 c
4-1149187609
chizra
2006-06-01 22:46
2006.10.22
У меня какая-то ошибка после установки hookа WH_CALLWNDPROC


3-1156168884
Bless
2006-08-21 18:01
2006.10.22
ADO и обрыв соединения с SQL-сервером


6-1148482475
Veetyok
2006-05-24 18:54
2006.10.22
иероглифы при чтении почты


3-1156767901
Shaman_
2006-08-28 16:25
2006.10.22
Отключить механизм кэширования у TClientDataSet


15-1159415891
vajo
2006-09-28 07:58
2006.10.22
Intel продемонстрировала 80-ядерный суперпроцессор будущего




   Наверх