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

标签 c++ sockets boost-asio

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

相关文章:

c++ - Cuda 以原子方式执行操作

c# - 长度= 'serverStream.Length'引发了 'System.NotSupportedException'类型的异常

php - 如何停止在另一个页面中执行 php 脚本?

c++ - 使用Boost asio接收命令并执行

c++ - 向 ssl 服务器发送 GET 命令以获取结果

C++ printf 问题 : How can I safely pass a char* to printf?

C++,菱形继承(钻石问题),何时/何地需要实现纯虚拟?

c++ - 使用 FMA(融合乘法)指令进行复数乘法

java - 从服务器套接字读取客户端 URL 请求

c++ - boost asio多播重新加入一个组