gpt4 book ai didi

c++ - asio的tcp socket::async_wait(),然后关闭套接字

转载 作者:行者123 更新时间:2023-12-02 10:37:46 32 4
gpt4 key购买 nike

在打开的套接字上时,我调用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/

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