Как сообщить серверу TCP, что конкретное сообщение закончилось? - PullRequest
1 голос
/ 07 января 2012

TCP-клиент отправляет данные побайтно.Итак, как сообщить серверу, что это сообщение закончилось и новое сообщение начинается сейчас?

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

Есть ли другой оптимальный выход?

Ответы [ 4 ]

1 голос
/ 07 января 2012

Извлечение реализации, используемой в networkComms.net , коммуникационной среде с открытым исходным кодом.В частности IncomingPacketHandleHandOff () в строке 892 здесь .

Это гарантирует, что первый полученный байт определяет размер заголовка пакета (менее 255 байтов).После получения достаточного количества байтов для восстановления заголовка заголовок может быть проверен для определения оставшегося размера, который должен быть получен (раздел данных).Если у вас больше входных байтов, чем ожидаемый заголовок и разделы данных, вы смотрите на самый первый байт и начинаете заново.

Использование символов с закладками - это то, что используется на базовом уровне сетевого стека, но должно быть реализовано тщательночтобы избежать дальнейших осложнений.

1 голос
/ 07 января 2012

Если вы хотите использовать символ как маркер конца сообщения или как часть сообщения, вам нужно использовать escape-последовательность.

Например: используйте символ «$» для завершения сообщения и «%» для выхода

т.е.

%$ -> $
%% -> %

затем используйте '$' для завершения сообщения

Все альтернативно отправляют количество байтов, которые должны быть получены в начале сообщения (или чанка сообщения, если вы не знаете длину полного сообщения в этот момент).

1 голос
/ 07 января 2012

Если сообщение является двоичным, кодирование с разделителями с использованием специального символа невозможно. Для этого лучше всего подойдет кодировка длины тега (TLV).

например

 +--------+----------+----------------+    
 |  Tag   | Length   |  Content       |    
 | 0x0001 |  0x000C  | "HELLO, WORLD" |    
 +--------+----------+----------------+

в дополнение к этому, вы можете иметь более одного типа сообщения

1 голос
/ 07 января 2012

Одним из возможных способов может быть то, что перед отправкой реального сообщения вы можете отправить количество байтов в конкретном сообщении. Когда принимающая сторона получила это количество байтов, она может начать получать следующее сообщение

...