检测死套接字

C++ - detecting dead sockets

本文关键字:套接字 检测      更新时间:2023-10-16

我有一个用c++编写的服务器应用程序。当客户端连接时,它为他创建一个新线程。在该线程中,从套接字读取阻塞。因为客户端有可能意外断开连接并留下一个仍然挂在read函数上的线程,所以有一个线程通过发送"心跳消息"来检查套接字是否仍然存活。该消息由1个字符组成,并被客户端"忽略"(不像处理其他消息那样处理它)。写入内容如下所示:

write(fd, ";", 1);

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

编辑:

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

我想你说的"socket "是指TCP网络套接字。

如果这是真的,那么TCP协议会给你一个keepalive选项,你需要请求操作系统使用。

我认为这个StackOverflow答案得到了你需要做的事情,假设有一个BSDish套接字库。

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

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

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

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