Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему идёт сразу два покета ? [D5, Win2k]


VID ©   (2002-08-05 15:39:00) 

Сервер - 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.

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


Malder   (2002-08-06 19:32:00) [1]

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

Digitman © (05.08.02 16:23)
>DiamondShark

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


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


Digitman   (2002-08-06 18:43:00) [2]

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


Digitman   (2002-08-06 18:34:00) [3]

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

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

цитата :

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


Malder   (2002-08-06 18:09:00) [4]

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


Digitman   (2002-08-06 13:33:00) [5]

>Malder

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


Malder   (2002-08-06 13:27:00) [6]

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

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


cyborg   (2002-08-05 21:43:00) [7]

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


Digitman   (2002-08-05 17:20:00) [8]

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


VID   (2002-08-05 16:44:00) [9]

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

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

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

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


Digitman   (2002-08-05 16:23:00) [10]

>DiamondShark

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


DiamondShark   (2002-08-05 15:59:00) [11]


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


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

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


Digitman   (2002-08-05 15:51:00) [12]

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


VID   (2002-08-05 15:47:00) [13]

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


Digitman   (2002-08-05 15:45:00) [14]

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

TEXT_1

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо