2
我已经编写了一个使用boost:asio库的程序,它在2个tcp服务器之间传输数据。 一台服务器使用下面的代码来发送数据:boost :: asio :: async_read获取文件错误结尾
std::shared_ptr<std::string> s =
std::make_shared<std::string>(message);
boost::asio::async_write(socket_, boost::asio::buffer(*s),
std::bind(&TcpServer::HandleWrite, shared_from_this(), s, _1, _2));
在另一个TCPSERVER,当我使用async_read_until得到的数据,一切工作正常,但如果我更换async_read_until到async_read,它提供了一个End Of File
错误:
boost::asio::streambuf input_buffer;
boost::asio::async_read_until(socket_, input_buffer, match_condition(),
std::bind(&TcpServer::HandleRead, shared_from_this(), _1));
//boost::asio::async_read(socket_, input_buffer, boost::asio::transfer_all(),
// std::bind(&TcpServer::HandleRead, shared_from_this(), _1));
如果我在async_read中使用boost::asio::transfer_at_least(1)
,我可以得到预期的结果。
为什么会发生这种情况?
我找到了原因,如果我使用transfer_all,我需要使用具有固定大小的缓冲区,否则会发生错误,因为async_read无法填满缓冲区。 – user2538425
发生错误是因为流的末尾已达到(并且您请求继续阅读直到该事件) - 即。这并不是真正的失败之处。它只是表示流的结束。数据仍然可供您使用。 –