如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

2024-05-20

我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12.3 (x86_64),我为每个客户端使用一个线程来接收数据。

我的问题是:
我使用一个终端来运行服务器,并使用其他几个终端来运行服务器telnet到我的服务器(作为客户端)。我用过recv()在服务器从客户端接收数据时,我还应用了对返回值的检查recv()即错误-1;康涅狄格州 关闭时间0& 其他情况正常运行。我没有使用任何标志recv().

如果我通常使用关闭 telnet 会话(即断开客户端连接),我的程序可以正常工作Ctrl+] and close,但是如果我使用强行终止客户端kill <pid>那么我的服务器无法检测到连接丢失。

如何解决这个问题?

约束:我不想在客户端设置条件,我只想在服务器端修复此问题。


您可以启用SO_KEEPALIVE在服务器的套接字上。

/* enable keep-alive on the socket */
int one = 1;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one));

默认情况下,启用保持活动状态后,在尝试保持活动状态探测之前,连接必须空闲 2 小时。您可以通过调整保持活动时间来更积极一些TCP_KEEPIDLE范围:

int idletime = 120; /* in seconds */
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &idletime, sizeof(idletime));

当发送探测时,它期望来自另一端的确认。如果有确认,探测器将保持沉默,直到空闲计时器再次到期。如果未收到探测确认,则默认情况下每 75 秒重试一次保持活动探测。这可以通过调整TCP_KEEPINTVL选项。这TCP_KEEPCNT选项控制有多少次连续失败会触发连接被断开。默认情况下,该数字为 9。

这些选项在 Linux 上可用。 BSD 有类似的选项,但名称不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用recv()检测客户端是否仍然连接(并且没有挂起)? 的相关文章

随机推荐