C ++ - 检测死套接字

时间:2014-07-28 14:39:53

标签: c++ sockets tcp

我有一个用C ++编写的服务器应用程序。当客户端连接时,它会为他创建一个新线程。在该线程中,有一个来自套接字的BLOCKING读数。因为客户端可能会意外断开并留下仍然挂在读取功能上的线程,所以有一个线程通过发送“心跳消息”来检查套接字是否仍处于活动状态。该消息由1个字符组成,并被客户端“忽略”(它不像其他消息一样处理)。写作看起来像这样:

write(fd, ";", 1);

它工作正常,但是真的有必要通过套接字发送随机字符吗?我试图发送一条空消息(“”长度为0),但它不起作用。有没有更好的方法来解决这个套接字检查?

修改

我正在使用BSD套接字(TCP)。

3 个答案:

答案 0 :(得分:2)

我假设当你说“套接字,你的意思是一个TCP网络套接字。

如果这是真的,那么TCP协议会为您提供一个keepalive option,您需要请求操作系统使用。

我认为这个StackOverflow answer得到你需要做的,假设一个BSDish套接字库。

答案 1 :(得分:2)

根据我的经验,在TCP上使用心跳消息(并检查响应,例如NOP / NOP-ACK)是在应用层获得可靠和及时的连接指示的最简单方法。网络层可以做​​一些有趣的事情,但在您的应用程序中获取通知可能会很棘手。

如果您可以切换到UDP,您将在应用程序层拥有更多的控制和灵活性,并且可能因为您可以自定义通信而减少整体流量,但您需要自己处理可靠性,数据包排序等。

答案 2 :(得分:1)

您可以设置连接KEEPALIVE。您可能对此链接感兴趣:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

如果它只是玩具,你可以为每个新来的请求创建一个线程。在大多数情况下,我使用轮询,即非阻塞io,以提高性能。