2015-05-21 2 views
0

У меня есть простая функция, которая отвечает за прием пакетов через сокет.recv читает неполный пакет

if((recv_size = recv(sock , rx , 50000 ,0)) == SOCKET_ERROR) 
    { 
    ...       
    } else 
    { 
    ... 
    } 

Я обнаружил, что иногда я получаю незавершенный пакет. Зачем? Mybe Мне нужно использовать recv несколько раз? Длина пакета никогда не превышает 50000 байт.

Я использую TCP-сокет.

+0

Какую розетку вы используете? UDP или TCP? В TCP может потребоваться несколько раз recv. – AdamF

ответ

4

Если вы используете TCP, это ожидается. TCP является протоколом streaming, он не имеет «пакетов» или границ сообщений, и вы можете получить все «сообщение» или его часть или даже несколько сообщений. Поэтому вам, возможно, придется позвонить recv несколько раз, чтобы получить полное сообщение.

Однако, поскольку TCP не имеет границ сообщений, вы должны реализовать их самостоятельно поверх TCP, например, отправив длину сообщения в заголовок фиксированного размера или у которого есть специальный конец, маркер сообщения.

+0

Но что, если больше данных не поступит, и я снова вызываю recv. В этом случае я буду ждать, пока эта функция вернется. – vico

+0

@vico. Вы должны сообщить recv только для чтения, пока не будете потреблять все данные, которые вы ожидаете, которые вы определите, прочитав заголовок длины фиксированного размера или какой-либо конец маркера сообщения. Если вам интересно, как обрабатывать ожидающие сообщения после того, как вы закончите получать предыдущий, то вы захотите добавить потоки на свой сервер, чтобы вы не блокировались, ожидая возвращения recv. – chemdt

+0

@vico Если в вашем протоколе есть границы или длины сообщений, вы можете прочитать нужную сумму (возможно, с несколькими вызовами), или вы можете использовать, например. 'seelct' или' poll', чтобы увидеть, когда есть данные для чтения без блокировки функции приема, или вы можете использовать неблокирующие сокеты. –

 Смежные вопросы

  • Нет связанных вопросов^_^