2013-07-01 65 views
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),我可以得到预期的结果。

为什么会发生这种情况?

回答

3

eof错误表示写入方关闭了连接。之前发送的任何数据仍应在TcpServer::HandleRead回调中可用。检查bytes_transferred参数以确定读取器接收了多少数据。

+0

我找到了原因,如果我使用transfer_all,我需要使用具有固定大小的缓冲区,否则会发生错误,因为async_read无法填满缓冲区。 – user2538425

+0

发生错误是因为流的末尾已达到(并且您请求继续阅读直到该事件) - 即。这并不是真正的失败之处。它只是表示流的结束。数据仍然可供您使用。 –

相关问题