在打开的套接字上时,我调用async_read()/read(),对等方随后关闭套接字-我将在处理程序中收到eof
错误,但是对于async_wait()/wait()不会发生,该处理程序调用时没有错误,即error_code == 0
应该是这样吗?
例子:
#include <boost/asio.hpp>
#include <iostream>
int main() {
const char *ip = "127.0.0.1";
const std::uint16_t port = 44550;
boost::asio::io_context ioctx;
boost::asio::ip::tcp::endpoint ep{boost::asio::ip::address::from_string(ip), port};
boost::asio::ip::tcp::acceptor acc{ioctx, ep, true};
acc.async_accept(
[](const boost::system::error_code &ec, boost::asio::ip::tcp::socket sock){
if ( ec ) {
std::cout << "accept error: " << ec.message() << std::endl;
return;
}
boost::system::error_code wec;
sock.wait(boost::asio::ip::tcp::socket::wait_read, wec);
if ( wec ) {
std::cout << "wait error: " << wec.message() << std::endl;
} else {
std::cout << "wait OK" << std::endl;
}
}
);
return ioctx.run();
}
使用boost-1.69和boost-1.72测试
最佳答案
是的。 async_wait
仅等待套接字准备就绪。文档说,特别是:
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.
请注意,同级关闭不构成这种错误情况(感谢@DavidSchwartz在注释中指出)。
相反,随后的读取操作将揭示该条件(在Asio中通过错误代码
asio::error::eof
呈现)。这里的想法是将
async_wait
用于 react 堆样式的处理程序,并且您希望套接字的行为对于使用基础IO句柄的代码是透明的(例如,可能是要响应的第三方库代码)对等体关闭,因此通过在Asio级别处理机会来捕获机会是没有意义的)
关于c++ - asio的tcp socket::async_wait(),然后关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488944/