【问题标题】:Boost.Asio socket::close not throwing boost::asio::error::operation_aborted errorBoost.Asio socket::close 不抛出 boost::asio::error::operation_aborted 错误
【发布时间】:2015-10-12 18:35:52
【问题描述】:

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];
};

【问题讨论】:

  • 你是关闭发送套接字还是接收套接字?哪个套接字接收到 connection_aborted 代码?请分享一个SSCCE

标签: c++ sockets boost


【解决方案1】:

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

备注

关于优雅关闭连接的套接字的可移植行为,请在关闭套接字之前调用 shutdown()。

在您的关闭函数中尝试以下操作:

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

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

很有趣,当我使用不调用 shutdown 的实现时,我在 Windows 而不是 Linux 上看到了这个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多