Несколько сообщений в одном BeginReceive - PullRequest
1 голос
/ 07 октября 2010

Если клиент отправляет несколько сообщений на сервер через один и тот же сокет, будет ли EndReceive на стороне сервера держать сообщения разделенными или же сервер сможет получать частичные сообщения от двух отдельных отправок в одном BeginReceive?

1 Ответ

1 голос
/ 07 октября 2010

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

Редактировать:

Чтобы ответить на вопросы в вашем комментарии - этим занимается не только «MS OS» - это стеки TCP / IP по обе стороны соединения.Байты, записанные в сокет, буферизуются внутри ядра и отправляются по проводам, когда сетевой стек считает, что это лучшее время для этого (истекло время ожидания в ядре, очередь вывода достигла размера окна TCP и т. Д. - все это в деталях.о том, как работает TCP).Для TCP (но не для UDP) ядро ​​не отслеживает границы записи приложения, только сколько байтов нужно отправить, сколько было подтверждено и т. Д. Это поток, ОС не знаето сообщениях приложения , только байты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...