Получает ли BeginReceive () все, что отправлено BeginSend ()? - PullRequest
0 голосов
/ 06 мая 2010

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

Я использую BeginReceive() и BeginSend() с обеих сторон для отправки и получения данных. Мой вопрос, если эти два утверждения верны:

  1. Использование вызова BeginReceive () даст мне все данные, которые были отправлены одним вызовом BeginSend () на другом конце, когда вызывается функция обратного вызова.

  2. Использование вызова BeginSend () отправит все данные, которые я передал, на другой конец, и все они будут получены одним вызовом BeginReceive () на другом конце.

На самом деле они в основном одинаковы.

Если ответ «нет», то, как я предполагаю, основано на том, что я прочитал о сокетах, каков наилучший способ обработки команд? Я пишу игру, в которой будут такие команды, как PUT X Y. Я думал о добавлении специального символа (например, #) в конец каждой команды, и каждый раз, когда я получаю данные, я добавляю их в буфер, а затем анализирую их только после того, как обнаружив #.

1 Ответ

1 голос
/ 06 мая 2010

Нет, вы не можете ожидать, что BeginReceive обязательно получит все данные от одного звонка до BeginSend. Вы можете отправить lot данных за один вызов на BeginSend, который вполне может быть разделен на несколько пакетов. Вы можете получать данные каждого пакета в отдельном вызове приема.

Два основных способа разделения потока на несколько частей:

  • Используйте разделитель (согласно вашему текущему предложению). Преимущество этого состоит в том, что нет необходимости заранее знать размер, но имеет недостаток, заключающийся в том, что он довольно сложен для анализа и потенциально вводит требования, такие как экранирование.
  • Предварительно добавьте размер каждого сообщения перед сообщением. Получатель может сначала прочитать длину, а затем точно знать, сколько данных ожидать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...