我编写了一个使用boost:asio库的程序,它在2个tcp服务器之间传输数据。 一台服务器使用以下代码发送数据:
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)
,我可以得到预期的结果。
为什么会这样?
答案 0 :(得分:3)
eof错误表示编写者端关闭了连接。在此之前发送的任何数据仍应在TcpServer::HandleRead
回调中可用。检查bytes_transferred
参数以了解读者收到的数据量。