c++ - Boost.Asio socket::close 不抛出 boost::asio::error::operation_aborted 错误

标签 c++ sockets boost

Boost官网的socket::close()函数,见description

“此函数会导致所有未完成的异步连接、发送和接收操作立即完成,并且取消操作的处理程序将传递 boost::asio::error::operation_aborted 错误。”


但奇怪的是,当我调用 chat_session::close() 时,socket::close() 传递的是 ERROR_CONNECTION_ABORTED (1236) 错误,而不是 boost::asio::error::operation_aborted (995)。

为什么会这样? 这是我的 chat_session 类。

class chat_session
    : public boost::enable_shared_from_this<chat_session>
{
public:
    chat_session(boost::asio::io_service& io, chat_server* room)
        : m_sock(io), m_room(room)
    {
    }

    ~chat_session()
    {
    }

    void start()
    {
        m_room.join(shared_from_this());

        m_sock.async_read_some(
            boost::asio::buffer(m_recv_data),
            boost::bind(&chat_session::handle_read, shared_from_this(),
            boost::asio::placeholders::error));
    }

    void close()
    {
        // closing socket. chat_session::handle_read will receive
        // boost::asio::error::operation_aborted error.
        m_sock.close(); 
    }

    boost::asio::ip::tcp::socket& socket()
    {
        return m_sock;
    }

    private:
    void handle_read(const boost::system::error_code& error)
    {
        if (!error)
        {
            printf("RECV -> %s.\n", m_recv_data);

            m_sock.async_read_some(
                boost::asio::buffer(m_recv_data),
                boost::bind(&chat_session::handle_read, shared_from_this(),
                boost::asio::placeholders::error));
        }
        else
        {
            // when i call chat_session::close(),
            // ERROR_CONNECTION_ABORTED (1236) error occurred
            // instead of boost::asio::error::operation_aborted error over here
            ...
            m_room.leave(shared_from_this());
        }
    }

    boost::asio::ip::tcp::socket m_sock;
    chat_room& m_room;
    char m_recv_data[50];
};

最佳答案

在关闭套接字之前先尝试调用 shutdown,正如 boost basic_stream_socket::close 文档在备注 here 中指定的那样:

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.

在您的关闭函数中尝试类似以下内容:

m_sock.shutdown(boost::asio::ip::tcp::socket::shutdown_receive);
m_sock.close();

如果要关闭发送和接收,请使用“shutdown_both”而不是“shutdown_receive”。

有趣的是,我已经看到这个错误发生在 Windows 而不是 Linux 上,当使用一个没有调用关闭的实现时。

关于c++ - Boost.Asio socket::close 不抛出 boost::asio::error::operation_aborted 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087947/

相关文章:

c++ - 为什么我不能将 char* 静态转换为 std::byte*?

node.js - 与 Node 的 SMTP 连接

linux - 了解 recv 永远阻塞的原因

java - 客户端-服务器套接字

c++ - 使用 CMake 编译 cpp-netlib + Boost 程序不工作

c++ - 导出的 C++ 类的 boost::hash_value 内联函数

c++ - 写时复制的线程安全

c++ - execl 不运行编程

c++ - 在 WSL 上使用 boost 时 undefined reference (Windows 上的 Bash)

c++ - 当我更改本地类名称时出现段错误