![](/img/trans.png)
[英]How to close boost asio server socket with all client sockets connected
[英]Boost ASIO: How can a server know if a client is still connected?
我正在使用boost::asio
作为服务器/客户端应用程序。 服务器一次只接受一个连接。 我想知道服务器验证客户端是否仍然连接的最佳方法是什么。
这样做的目的是,我希望能够知道客户端是否已崩溃,以便我可以重新开始侦听新的连接尝试。
在我的应用程序中,我使用以下标志,当客户端断开连接时我的读取出来。 如果它在您的申请中,请尝试。 连接后立即应用此标志。
在我的情况下, skt_TCP
的类型为boost::asio::ip::tcp::socket
int32_t accept_server_socket = skt_TCP.native_handle();
int32_t timeout = 8;
int32_t cnt = 2;
int32_t intverval = 2;
// Added Keepalive flag
boost::asio::socket_base::keep_alive opt_keep_alive(true);
skt_TCP.set_option(opt_keep_alive);
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout));
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt));
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPINTVL, &intverval, sizeof(intverval));
这实际上取决于您选择的协议。
如果您的服务器协议始终等待来自客户端的消息,则每个连接的客户端将始终具有挂起的async_read
。 当客户端以任何方式断开连接时,这应该返回错误(EOF)。
Keep-alive是一种如上所述的方法,但是等待async_read
的工作就好了。
简单的事件协议涉及客户端侦听数据和发送它的服务器。 在此协议中,服务器不知道客户端是否存在,因为客户端仅接受数据并继续等待。 客户端永远不会向服务器发送任何消息。
这提出了保持活力的要求。 async_write
操作不会像客户端已断开连接时async_read
那样失败。
还有其他选项,例如让服务器始终具有尝试读取1个字节的挂起的async_read
操作。 当客户端断开类似于上面的简单命令协议讨论时,这将失败,但由于客户端不通过简单事件协议发送数据,因此将永远不会成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.