заполнение ответов в recv () api - PullRequest
0 голосов
/ 29 марта 2012
  1. На стороне клиента он всегда получает полный ответ, или есть вероятность получить половину ответа в одном виде, а оставшуюся половину - в другом (например, в зависимости от буфера, который мы определили для API recv ()).,
  2. Есть ли шансы на получение двух ответов, добавленных в recv () API.

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

TCP не сохраняет границы сообщений. Все, что он выставляет, это поток байтов. Поэтому send (), которые вы вызываете на одной стороне, могут не соответствовать recv () на другой стороне. Например, может произойти следующее:

  • А вызовы send () с 100 байтами, затем повторные вызовы send () с 100 байтами
  • B вызывает recv () и получает 200 байтов (см. Алгоритм Нэгла )

Или, наоборот:

  • отправка вызовов () с 1 МБ
  • B вызывает recv (), получает 512 КиБ, затем снова вызывает recv (), получает 512 КиБ (недостаточно места в буфере как на получателе, так и на стороне отправителя).

Относительно вашего вопроса о заполнении, не то чтобы у вас было , чтобы проверить возвращаемое значение recv (), чтобы увидеть, сколько байтов фактически возвращено в ваш буфер.

1 голос
/ 29 марта 2012

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

Чтобы ответить на ваши вопросы: вы можете получить меньше, чем полный «ответ», или вы можете получить более полный «ответ». Если вы получите более одного полного ответного сообщения, вы можете получить два, или полтора, или что-нибудь еще, кроме одного.

0 голосов
/ 29 марта 2012

Вы можете сформировать блок данных, переданный для отправки следующим образом: [6 байт: заголовок размера данных] [данные]

Затем вызовите recv () в цикле, читающем 1 байт на каждой итерации.Считайте «заголовок размера данных» (первые 6 байтов) и выделите буфер желаемого размера, затем прочитайте остальные байты.

...