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

Вниз

Почему идёт сразу два покета ?   Найти похожие ветки 

 
VID ©   (2002-08-05 15:39) [0]

Сервер - TServerSocket, Клиент - TclientSocket
Ситуация такая:

Клиент подключается к серверу. всё нормально. Сервер, ловит событие onClientConnect и :

procedure Server.OnClientConnect (...Socket:TCusto...);
begin

Socket.SendText ("TEXT_1");
Socket.SendText("TEXT_2");

end;

Клиента в свою очередь ловит событие
onRead и :
Procedure ClientOnREAD(...);
Var S:String;
begin
S:=Client.ReceiveText;
Memo1.Lines.Add("");
Memo1.Lines.Add(S);
end;

Как видите, в данной ситуации после подключения клиента к серверу, memo1 программы-клиента (речь идёт о двух программах - клиенте и сервере), должен содержать след строки:
-------------------------

TEXT_1

TEXT_2
-------------------------
(рис 1)

НО проблема в том, что при первом коннекте клиента к серверу, либо когда коннект происходит после того как сервер отключил клиента, memo1 программы-клиента выглядит так:
-------------------------

TEXT_1TEXT_2
-------------------------
(рис 2)

В дальнейшем, если отключение клиента было инициировано со стороны клиента, то при его последующем коннекте к серверу всё ок, - рис 2.

Если же, клиент был отключён сервером, то проблема - рис 1.

Думаю, изложенная мною проблема, ясна. Очень надеюсь на Вашу помощь.


 
Digitman ©   (2002-08-05 15:45) [1]

>>должен содержать след строки:
-------------------------

TEXT_1

TEXT_2
-------------------------

Почему - "должен" ? Где это написано ?


 
VID ©   (2002-08-05 15:47) [2]

а почему нет ??? Судя по приведённому коду - должен.


 
Digitman ©   (2002-08-05 15:51) [3]

А каковы аргументы твои ? За исключением того, что визуально это выглядит как вызов двух отдельных send-методов ? Чем руководствуешься кроме ассоциативных предположений ?


 
DiamondShark ©   (2002-08-05 15:59) [4]


> а почему нет ??? Судя по приведённому коду - должен.


Судя по приведенному коду -- не должен

WinSock имеет полное право объединять несколько посылок в одну.


 
Digitman ©   (2002-08-05 16:23) [5]

>DiamondShark

Уточню : не Winsock (это - всего лишь API-надстройка), а TCP-гнездо в режиме SOCK_STREAM


 
VID ©   (2002-08-05 16:44) [6]

ОК :) А может ли сокет клиента, в подобной ситуации:

Client.socker.SendText ("TEXT_1");
Client.socker.SendText ("TEXT_2");

послать такой же сдвоенный пакет ?

по всей видимости, да ... так ?


 
Digitman ©   (2002-08-05 17:20) [7]

да, именно так.


 
cyborg ©   (2002-08-05 21:43) [8]

VID вроде ты давно на этом форуме, эту тему уже как минимум четыре раза обсуждали. Хотя возможно ты этим не интересовался.


 
Malder ©   (2002-08-06 13:27) [9]

Уточню : не Winsock (это - всего лишь API-надстройка), а TCP-гнездо в режиме SOCK_STREAM

А в каком режиме он не будет объединять пакеты никогда ?


 
Digitman ©   (2002-08-06 13:33) [10]

>Malder

режим SOCK_DGRAM (см. протокол UDP)


 
Malder ©   (2002-08-06 18:09) [11]

А при чем здесь TCP ?


 
Digitman ©   (2002-08-06 18:34) [12]

Имелось ввиду : UDP как один из транспортных протоколов в стеке протоколов TCP/IP (Transmision Control Protocol/Internet Protocol)

см., например, http://athena.vvsu.ru/net/book/intro.html

цитата :

Протокол UDP рассматривает ... данные как целостное сообщение; он никогда не разбивает сообщение для передачи в нескольких пакетах и не объединяет несколько сообщений для пересылки в одном пакете. Если прикладной процесс N раз вызвал модуль UDP для отправки данных (т.е. запросил отправку N сообщений), то модулем UDP будет сформировано и отправлено N пакетов, и процесс-получатель будет должен N раз вызвать свой модуль UDP для получения всех сообщений.


 
Digitman ©   (2002-08-06 18:43) [13]

А TCP-гнездо (столь смутившее тебя из-за аббревиатуры "TCP") - объект, предоставляющий удобный интерфейс для использования в контексте прикладной сетевой задачи стека протоколов TCP/IP с возможностью опционального выбора того или иного транспортного уровня (читай - транспортный режим, например, SOCK_STREAM, SOCK_DGRAM, SOCK_RAW и т.д.)


 
Malder ©   (2002-08-06 19:32) [14]

WinSock имеет полное право объединять несколько посылок в одну.

Digitman © (05.08.02 16:23)
>DiamondShark

Уточню : не Winsock (это - всего лишь API-надстройка), а TCP-гнездо в режиме SOCK_STREAM


Тогда уж не TCP-гнездо в режиме SOCK_STREAM, а протокол TCP. А его реализация в конкретной ОС не имеет значения.



Страницы: 1 вся ветка

Текущий архив: 2002.10.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
14-21190
Ч а й н и к
2002-09-03 22:42
2002.10.07
---|Ветка была без названия|---


1-21042
Влад Утюмов
2002-09-27 07:55
2002.10.07
Хранение Integer в Combobox


14-21212
Down
2002-09-10 12:37
2002.10.07
Настройка Оdigо


14-21273
Nikolay
2002-09-12 22:58
2002.10.07
Ищут пожарные, ищет милиция...


6-21171
BorisMor
2002-08-03 12:05
2002.10.07
Рабочий URL