我有这样的示例(*)代码:
std::string protocol = "http";
std::string server = "www.example.com";
std::string path = "/";
asio::io_service service;
asio::ip::tcp::resolver resolver(service);
asio::ip::tcp::resolver::query query(server, protocol);
asio::ip::tcp::socket socket(service);
asio::ip::tcp::resolver::iterator end;
auto it = resolver.resolve(query);
asio::error_code error;
socket.connect(*it, error);
while(error && ++it!=end)
{
socket.close();
socket.connect(*it, error);
}
asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
asio::streambuf response;
size_t s = asio::read(socket, response);
当asio::read
被调用时,我得到:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::system_error> >'
what(): read: End of file
据我了解,发生此错误是因为套接字在尝试读取时关闭。但我不明白为什么它会被关闭。
我最初有read_until
,但它也有同样的错误。
我是否在启动连接时出错了,还是因其他原因而被终止?
(*)示例意味着它是一个例子,而不是一个完整的工作程序。如果示例可以缩短或更好,请随时编辑问题。
根据我的回答,我尝试了以下方法:
size_t s = asio::read(socket, response, error);
if(!error || error==asio::error::eof)
{
if(s==0)
{
std::cerr << "Same problem" << std::endl;
}
}
结果是运行程序时显示“相同问题”,这意味着在读取任何数据之前它会获得EOF。
根据YSC的回答,我尝试了以下方法:
for (;;)
{
char buf[255];
size_t len = socket.read_some(asio::buffer(buf, 255), error);
if (error == asio::error::eof)
{
std::cout << std::endl << "Connection closed" << std::endl;
break; // Connection closed cleanly by peer.
}
else if (error)
{
std::cerr << "Error" << std::endl;
return 1;
}
std::cout.write(buf, len);
}
没有数据出现,稍有延迟后会显示“Connection closed”。这意味着我在没有任何数据的情况下也可以获得EOF。
答案 0 :(得分:3)
只需处理错误情况:http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio/reference/read/overload2.html
asio::streambuf response;
boost::system::error_code ec;
size_t s = asio::read(socket, response, ec); // no condition, so read till EOF
if (!ec || ec == boost::asio::error::eof) {
// woot, no problem
}
答案 1 :(得分:0)
您的socket
有一个read_some()
方法,在关闭时不会抛出,但返回boost::asio::error::eof
。
您可能会发现this boost tutorial有用。