2015-10-12 54 views
0

Boost的官方網站插座:: close()函數,見descriptionBoost.Asio的插座::關閉不扔的boost ::支持ASIO ::錯誤:: operation_aborted錯誤

「此功能會導致所有未完成的異步連接,發送和接收操作立即完成,並且取消操作的處理程序將傳遞boost :: asio :: error :: operation_aborted錯誤。「


但奇怪的是,當我打電話chat_session :: close()方法,插座:: close()方法傳遞ERROR_CONNECTION_ABORTED(1236)錯誤而不是升壓:: ASIO ::錯誤:: 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]; 
}; 
+0

您是否關閉發送套接字或接收套接字?哪個套接字接收到connection_aborted代碼?請分享一個SSCCE – sehe

回答

3

嘗試調用插槽上關閉第一關閉它之前,隨着增壓basic_stream_socket ::關閉文檔指定在備註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。