繁体   English   中英

Boost ASIO:服务器如何知道客户端是否仍然连接?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM