socket.read_some
считывает данные в буфер, который определяется boost::asio::buffer(buf)
.Размер этого буфера определяется buf.size()
.В вашем случае std::string
пусто, поэтому буфер для чтения байтов пуст.read_some
читает 0 байтов и возвращает.
Поскольку сервер всегда отправляет сообщение, состоящее из 2 байтов, вы можете изменить размер buf
для хранения 2 байтов:
std::string buf;
buf.resize(2);
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
// now read_some reads at most 2 bytes into buf
Поскольку на стороне сервера создается сокет, он отправляет сообщение и уничтожается, вы можете использовать dynamic_buffer
+ transfer_all
+ boost::asio::read
для чтения сообщения нефиксированной длины:
std::string buf;
size_t len = boost::asio::read (socket,boost::asio::dynamic_buffer(buf),
boost::asio::transfer_all(),error);
if (len && error == boost::asio::error::eof)
{
// data was read from server and eof is reached
// do sth with buf
}
boost::asio::read
считывает данные до тех пор, пока буфер не будет прочитан полностью или не возникнут некоторые ошибки (например, eof
- сокет на стороне сервера был закрыт).Сервер отправляет данные, клиент читает данные, сокет на сервере уничтожается, и клиент получает eof
из asio::read
.