Я думаю, что ваше "кадрирование" сообщений в потоке TCP правильно.
Вы могли бы рассмотреть вопрос о том, чтобы поместить "волшебный файл cookie" перед каждым кадром (например, написать 32-битное int "0xdeadbeef").в верхней части каждого заголовка кадра в дополнение к длине пакета), так что становится очевидным, что вы читаете заголовок кадра в первой из каждой пары recv ().Если магическое целое число отсутствует в начале сообщения, вы вышли из синхронизации и вам нужно разорвать соединение.
Множественные вызовы recv (), скорее всего, не повлияют на производительность.На самом деле, поскольку сообщения TCP могут быть сегментированы, объединены и заблокированы непредсказуемым образом, вам, вероятно, придется вызывать recv () в цикле, пока вы не получите все ожидаемые данные.Это включает в себя ваш двухбайтовый заголовок, а также для большего чтения байтов полезной нагрузки.Вполне возможно, что вы вызываете "recv" с 2-байтовым буфером, чтобы прочитать "размер" сообщения, но получите только 1 байт назад.(Снова вызовите recv, и вы получите последующие байты).Что я говорю разработчикам в моей команде - кодируйте ваши сетевые парсеры так, как если бы это было возможно, чтобы recv доставлял только 1 байт за раз.
Вы можете использовать неблокирующие сокеты и вызов "select", чтобы избежать зависания,Если данные не поступают в течение разумного промежутка времени (или поступает больше данных, чем ожидалось - так что синхронизация следующего сообщения становится невозможной), вы просто разрываете соединение.
Я работаю надмой собственный P2P-проект.Хотел бы торговать векселями.Следите за мной в автономном режиме, если хотите.