Пакеты укладываются при отправке через регулярные интервалы - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь отправить сообщение через сокет TCP через регулярные промежутки времени (каждую секунду). Иногда полное сообщение не будет отправлено или два-четыре сообщения будут сложены и отправлены одновременно. У меня есть заявления if для, если возвращаемое значение равно 0 или <0, но они никогда не верны. Я попробовал очевидный подход проверки точного возвращаемого значения send (), чтобы увидеть, было ли отправлено меньше или больше байтов. Он просто возвращает число, которое я указываю в параметре для отправки (что имеет смысл, если отправлять блоки, пока не отправит столько), даже если отправлено меньше байтов. Так есть ли точный способ сказать, «был ли отправлен пакет нужного размера? Нет? - сделать что-нибудь»? </p>

Ответы [ 4 ]

3 голосов
/ 01 августа 2011

TCP обеспечивает надежный поток байтов, границы сообщения отсутствуют.Если вам нужно знать длину сообщения, вы должны встроить его в протокол, например: отправлять каждое сообщение с 2-байтовым заголовком, который определяет длину сообщения.

2 голосов
/ 01 августа 2011

Нет такой возможности с TCP.Это зависит от сетевого стека в ядре, как разрезать TCP stream на пакеты.Сказав, что вы можете установить опцию TCP_NODELAY в своем сокете, чтобы отключить алгоритм Nagle .

1 голос
/ 01 августа 2011

Не уверен, какую платформу вы используете или какой синтаксис вы используете (потоки, FILE объекты или файловые дескрипторы; некоторый код пояснит это), но вам может потребоваться выполнить явную операцию flush после того, как вы напишите каждый сообщение для принудительного запуска ядра. Я обычно использую файловые дескрипторы в стиле C, и обычно достаточно вызвать fflush для дескрипторов, чтобы немедленно вывести все, что я поставил в очередь.

1 голос
/ 01 августа 2011

Если я вас правильно понимаю, иногда вы отправляете два или более пакетов, и они принимаются как один на удаленном конце.

Это природа TCP / IP. Вы не можете гарантировать, что пакеты будут доставлены как отдельные, просто они будут доставлены в порядке и надежно.

...