Вы говорите, что сокет имеет более 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
}