Форум: "Сети";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизПочему идёт сразу два покета ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c