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