gpt4 book ai didi

c - 如何使用 recv() 检测客户端是否仍处于连接状态(且未挂断)?

转载 作者:太空狗 更新时间:2023-10-29 15:58:34 24 4
gpt4 key购买 nike

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

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

如果我正常使用 Ctrl+] 关闭 telnet session (即断开客户端),我的程序工作正常和 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 有类似的选项,但名称不同。

关于c - 如何使用 recv() 检测客户端是否仍处于连接状态(且未挂断)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18307828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com