gpt4 book ai didi

c++ - 读取 : End of file in ASIO. 为什么套接字会关闭?

转载 作者:太空狗 更新时间:2023-10-29 21:39:04 25 4
gpt4 key购买 nike

我有这样的示例 (*) 代码:

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,但它有同样的错误。

是我在启动连接时做错了什么,还是由于其他原因终止了连接?

(*) Example 表示,它是一个示例,而不是一个完整的工作程序。如果示例可以更短或更好,请随时编辑问题。


根据 sehe 的回答,我尝试了以下操作:

size_t s = asio::read(socket, response, error);

if(!error || error==asio::error::eof)
{
if(s==0)
{
std::cerr << "Same problem" << std::endl;
}
}

结果是程序运行时显示“Same problem”,意思是在读取任何数据之前就得到了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);
}

没有数据出现,稍微延迟后显示“连接已关闭”。这意味着我也可以通过这种方法获得没有任何数据的 EOF。

最佳答案

只需处理错误情况: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
}

关于c++ - 读取 : End of file in ASIO. 为什么套接字会关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33841781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com