внутренняя работа recv сокета api - PullRequest
0 голосов
/ 26 апреля 2011

Я работаю над клиентским серверным приложением TCP, используя c ++. В этом проекте теперь разрешены сторонние библиотеки.

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

У меня следующие сомнения
Когда данные поступают на клиента из сети, ОС буферизует его до тех пор, пока приложение не вызовет функцию recv ().

Таким образом, два сообщения msg1 и msg2 поступают в буфер, и вызов recv возвращает msg1 + msg2. Теперь это может привести к сбою операции синтаксического анализа.

Мои запросы
1. является ли вышеупомянутое предположение правильным или нет?
2. Если вышеупомянутое предположение верно, то как можно решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Вы можете использовать протокол LV (длина-значение) для вашего сообщения.Кодируйте длину сообщения в первых (1-4) байтах, затем поместите сообщение.Примерно так, например: 14 «Hello world \ 0»

На вашем сервере, когда клиент отправляет что-то, вы должны будете recv () первые (1-4) байта, а затем recv ()длина сообщения.

0 голосов
/ 26 апреля 2011

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

У UDP есть сообщения, поэтому там можно получить отдельные сообщения.

...