如何检测提升 TCP 套接字何时断开连接
How to detect when a boost tcp socket disconnects
假设我有一个套接字:
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)) );
我将所述插座的weak_ptr存储在容器中。我需要这个,因为我想允许客户端请求其他客户端的列表,以便它们可以相互发送消息。
clients_.insert(socket); // pseudocode
然后我运行一些异步操作
socket->async_receive( boost::asio::buffer(&(*header), sizeof(Header))
, 0
, std::bind(handleReceiveHeader, this, std::placeholders::_1, std::placeholders::_2, header, socket));
如何检测连接何时关闭,以便从容器中删除套接字?
clients_.erase(socket); // pseudocode
TCP 套接字断开连接通常由eof
或connection_reset
以asio
表示。
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
}
}
我使用 boost::signals2
来发出断开连接的信号,尽管您始终可以将指向函数的指针传递给您的套接字类,然后调用它。
请注意套接字和回调生存期,请参阅: boost-async-functions-and-shared-ptrs
有很多选择,其中一些是:
-
当您将
weak_ptr
存储在容器中时 - 它不会延长套接字的使用寿命,因此当您的处理程序boost::asio::error::eof
(或其他什么)时,它不会复制/移动shared_ptr
,并且套接字将被删除(如果您没有任何其他人shared_ptr
它)。因此,您可以执行以下操作:if(socket.expired()) clients_.erase(socket);
-
检查处理程序中的错误代码 - 它将指示连接何时关闭。使用此信息 - 您可以从处理程序本身调用
clients_.erase
。
你能举一个#2的例子吗?
它将是这样的:
socket->async_receive
(
boost::asio::buffer(&(*header), sizeof(Header)), 0,
[=, &clients_](const system::error_code& error, size_t bytes_transferred)
{
if(error) // or some specific code
{
clients_.erase(socket); // pseudocode
}
else
{
// continue, launch new operation, etc
}
}
);
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- ASIO 的 TCP 套接字::async_wait() 并在此之后关闭套接字
- Visual Studio(C++):如何使用TCP套接字发送多个值
- TCP套接字(客户端-服务器)recv()返回-1值
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- C++中TCP套接字的recv函数
- 通过 TCP 套接字发送大型 base64 字符串
- 提升 ASIO TCP 套接字 1.70 不向后兼容
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 如何知道请求是否完全使用 TCP 套接字接收?
- Qt TCP 套接字 - 写入超过 15 个字节
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- C++ 如何通过套接字 (TCP) 进行二进制序列化
- 套接字 TCP 服务器程序问题
- Cpp套接字-TCP传输(使用同一端口发送,然后接收)