Протокол обмена сообщениями - PullRequest
2 голосов
/ 26 августа 2009

Как мне разработать протокол сообщений, чтобы различать пользовательские данные и завершение сообщения.

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

Как мне что-то подобное в C ++. Я использую сокеты Windows

Ответы [ 5 ]

3 голосов
/ 26 августа 2009

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

Редактировать: Пример запрошен. Допустим, мы разработали наш протокол так, чтобы максимальный размер сообщения составлял 255 байт, и мы хотим отправить строку «привет». Наше протокольное сообщение будет состоять из трех байтов: 2, 104, 105. Первый байт 2 сообщает нам длину сообщения, которое следует за ним. Второй и третий байты, 104 и 105, являются ASCII для h и i.

1 голос
/ 26 августа 2009

Сначала вы можете передать длину, затем сообщение.

0 голосов
/ 26 августа 2009

Или вы можете последовать примеру POP и использовать «.» в начале пустой строки.

0 голосов
/ 26 августа 2009

Существует много компьютерных систем, которые используют специальные маркеры для определения конца сообщения - c использует \ 0 для символьных массивов, JPEG использует 0xFF в качестве маркера и т. Д.

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

Сам TCP фактически делает это. Если вы записываете два байта пользовательского ввода в сокет, на другом конце будут доступны два байта, и пакеты TCP, обрабатываемые системой, знают об этом, поскольку они помечают каждый пакет длиной полезной нагрузки.

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

0 голосов
/ 26 августа 2009

Вы можете отправить сообщение в виде фрагментов и добавить к каждому фрагменту его длину. Поток будет завершен порцией нулевой длины. (Так HTTP делает, если длина потока заранее неизвестна.)

...