簡體   English   中英

Boost.Asio socket :: close不拋出boost :: asio :: error :: operation_aborted錯誤

[英]Boost.Asio socket::close not throwing boost::asio::error::operation_aborted error

Boost的官方站點socket :: close()函數,請參閱說明

“此功能使所有未完成的異步連接,發送和接收操作立即完成,並且已取消操作的處理程序將傳遞給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文檔在此處的備注中指定:

備注

對於與正常關閉已連接套接字有關的可移植行為,請在關閉套接字之前調用shutdown()。

在關閉函數中嘗試以下操作:

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

如果要關閉發送和接收,請使用“ shutdown_both”而不是“ shutdown_receive”。

有趣的是,當使用不帶關機調用的實現時,我已經在Windows上而不是Linux上發生了此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM