Увеличьте ASIO, чтобы прочитать байты X синхронно в вектор - PullRequest
4 голосов
/ 29 апреля 2010

Я сейчас пытаюсь написать клиент-серверное приложение с надстройкой, пока оно отправляет и получает, но я не могу просто прочитать X байтов в вектор.

Если я использую следующий код

vector<uint8_t> buf;

for (;;)
{
 buf.resize(4);
 boost::system::error_code error;

 size_t len = socket.read_some(boost::asio::buffer(buf), error);

 if (error == boost::asio::error::eof)
  break; // Connection closed cleanly by peer.
 else if (error)
  throw boost::system::system_error(error); // Some other error.
}

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

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

С уважением, Xeross

1 Ответ

3 голосов
/ 29 апреля 2010

Вы говорите, что сокет имеет более 4 байтов, доступных для чтения, и в этом случае ваш код корректно непрерывно зацикливается, поскольку eof не будет обнаружен, пока все данные не будут прочитаны. Мне кажется, что вы хотите использовать read (), а не read_some (), поскольку последний может возвращать меньше четырех байтов, которые вы хотите. Из документации read_some.

Операция read_some может не прочитать все запрошенное количество байтов. Рассмотрите возможность использования функции чтения, если вам необходимо убедиться, что запрошенный объем данных прочитан до завершения операции блокировки.

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

Я думаю, вы хотите больше, как показано ниже:

vector<uint8_t> buf(4);
try
{ 
  size_t len = read(socket, boost::asio::buffer(buf));
  assert(len == 4);
  // process the 4 bytes in buf
}
catch (boost::system::system_error &err)
{
  // handle the error e.g by returning early
}

boost::system::error_code error;

while (!error)
{
  size_t len = socket.read_some(boost::asio::buffer(buf), error);

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