TCP / IP, а также UDP, пакеты включают некоторую ссылку на их размер. IP-заголовок содержит 16-разрядное поле, которое определяет длину данных IP-заголовка и данных в байтах. Заголовок TCP содержит 4-разрядное поле, которое указывает размер заголовка TCP в 32-разрядных словах. Заголовок UDP содержит 16-битовое поле, которое определяет длину данных заголовка UDP и в байтах.
Вот в чем дело.
Используя стандартные общепринятые сокеты в Windows, независимо от того, используете ли вы пространство имен System.Net.Sockets в C # или собственный Winsock в Win32, вы никогда не увидите заголовки IP / TCP / UDP. Эти заголовки удаляются, так что при чтении сокета вы получаете реальную полезную нагрузку, то есть отправленные данные.
Типичный шаблон из всего, что я когда-либо видел и делал с использованием сокетов, заключается в том, что вы определяете заголовок уровня приложения, который предшествует данным, которые вы хотите отправить. Как минимум, этот заголовок должен включать размер данных для подражания. Это позволит вам прочитать каждое «сообщение» целиком, не догадываясь о его размере. Вы можете получить с ней столько фантазии, сколько захотите, например, шаблоны синхронизации, CRC, версию, тип сообщения и т. Д., Но размер «сообщения» - это все, что вам действительно нужно.
И для этого я бы предложил использовать заголовок вместо разделителя конца пакета. Я не уверен, есть ли существенный недостаток в ограничителе EOP, но заголовок - это подход, используемый большинством протоколов IP, которые я видел. Кроме того, мне кажется более интуитивно понятным обрабатывать сообщение с самого начала, а не ждать, пока в моем потоке появится какой-либо шаблон, указывающий, что мое сообщение завершено.
РЕДАКТИРОВАТЬ: я только что узнал о проекте Google Protocol Buffers. Из того, что я могу сказать, это двоичная схема сериализации / десериализации для WCF (я уверен, что это грубое упрощение). Если вы используете WCF, вам не нужно беспокоиться о размере отправляемых сообщений, потому что сантехника WCF позаботится об этом за кулисами, поэтому, вероятно, вы не нашли ничего, связанного с длиной сообщения в протоколе. Буферная документация. Однако, в случае с сокетами, знание размера очень поможет, как обсуждалось выше. Я предполагаю, что вы будете сериализовать свои данные с использованием буферов протокола, а затем перед отправкой добавите заголовок приложения. На приемной стороне вы снимаете заголовок, а затем десериализуете оставшуюся часть сообщения.