我写了一个多客户端服务器程序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(使用前将#替换为@)