Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.046 c
6-1148824908
rolex2002
2006-05-28 18:01
2006.10.22
Как проверить принадлежит ли ip адрес, определенному диапазону ip


2-1159791731
svt
2006-10-02 16:22
2006.10.22
Мастера, подскажите как сделать так, чтобы правильно


2-1159901078
MOVEz
2006-10-03 22:44
2006.10.22
WriteBinaryData


15-1159435468
Desdechado
2006-09-28 13:24
2006.10.22
Oriflame - нездоровые ассоциации :)


15-1159441851
Palladin
2006-09-28 15:10
2006.10.22
Авторизация на сервере





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский