Главная страница
    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.036 c
2-1160223112
Merry
2006-10-07 16:11
2006.10.22
Создание библиотеки


2-1160053586
Чародей
2006-10-05 17:06
2006.10.22
Цвет Node


15-1159466282
FedorC
2006-09-28 21:58
2006.10.22
Удаленка для Delphi программиста со знанием английского


6-1148825743
rolex2002
2006-05-28 18:15
2006.10.22
Как узнать у входящих пакетов ip адрес и их размер?


2-1160311802
alexa14
2006-10-08 16:50
2006.10.22
Динамическое создание popupmenu





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский