如何检测boost tcp套接字何时断开连接

aCu*_*ria 14 c++ sockets boost tcp boost-asio

假设我有一个套接字:

std::shared_ptr<tcp::socket> socket( new tcp::socket(acceptor.get_io_service()) );
acceptor.async_accept( *socket, std::bind( handleAccept, this, std::placeholders::_1, socket, std::ref(acceptor)) );
Run Code Online (Sandbox Code Playgroud)

我将weak_ptr存储在容器中的所述套接字中.我需要这个,因为我想允许客户端请求其他客户端列表,以便他们可以相互发送消息.

clients_.insert(socket);  // pseudocode
Run Code Online (Sandbox Code Playgroud)

然后我运行一些异步操作

socket->async_receive( boost::asio::buffer(&(*header), sizeof(Header))
    , 0
    , std::bind(handleReceiveHeader, this, std::placeholders::_1, std::placeholders::_2, header, socket));
Run Code Online (Sandbox Code Playgroud)

如何检测连接何时关闭,以便从容器中取出插座?

clients_.erase(socket); // pseudocode
Run Code Online (Sandbox Code Playgroud)

ken*_*nba 19

TCP套接字断开通常asio由a eof或a 发出信号connection_reset.例如

  void async_receive(boost::system::error_code const& error,
                     size_t bytes_transferred)
  {
    if ((boost::asio::error::eof == error) ||
        (boost::asio::error::connection_reset == error))
    {
      // handle the disconnect.
    }
    else
    {
       // read the data 
    }
  }
Run Code Online (Sandbox Code Playgroud)

boost::signals2用来发信号断开连接,尽管你总是可以将指向函数的指针传递给你的套接字类,然后调用它.

请注意套接字和回调生存期,请参阅:boost-async-functions-and-shared-ptrs

  • 可以在此处找到错误列表:http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/reference/error__basic_errors.html (2认同)
  • 凉。但是,如果您不想接收任何数据怎么办?我唯一想知道的是连接是打开还是关闭,甚至都没有尝试读取远程发送的任何内容。看起来asio中没有这样的API。 (2认同)
  • @OlegAndriyanov你的要求听起来很不寻常.这是一种通信协议,因此发送和接收数据是它的存在理由...... (2认同)