C++ C-检测TCP套接字断开连接

C++ C-检测TCP套接字断开连接,c++,c,sockets,network-programming,C++,C,Sockets,Network Programming,我正在实现一个tcp服务器套接字。服务器与另一设备中的客户端套接字通信 问题是:如果连接突然断开(电缆断开),recv()函数就不会返回 我无法实现乒乓(心跳)机制,因为我无法控制设备的实现 在网上搜索了一段时间后,我找到了这个教程: 但我不完全理解导师的意思。如果我在SO_KEEPALIVE、TCP_keepnt、TCP_KEEPIDLE、TCP_KEEPINTVL上调用setsockopt(),导师说它将覆盖系统范围的变量(TCP_KEEPALIVE_time、TCP_KEEPALIVE_i

我正在实现一个tcp服务器套接字。服务器与另一设备中的客户端套接字通信
问题是:如果连接突然断开(电缆断开),recv()函数就不会返回
我无法实现乒乓(心跳)机制,因为我无法控制设备的实现
在网上搜索了一段时间后,我找到了这个教程:
但我不完全理解导师的意思。如果我在SO_KEEPALIVE、TCP_keepnt、TCP_KEEPIDLE、TCP_KEEPINTVL上调用setsockopt(),导师说它将覆盖系统范围的变量(TCP_KEEPALIVE_time、TCP_KEEPALIVE_intvl、TCP_KEEPALIVE_probe)

它是否会影响其他线程/进程创建的其他套接字?

TCP没有提供检测未发送端断开连接的好方法。如果设备使用的协议没有为服务器提供任何方法来检测断开的连接,则该协议已断开。你所能做的就是实现一个接收超时,但那太糟糕了


协议是否有文档?它说要做什么?

TCP保持活动功能允许您检测断开的连接。您需要为套接字显式地启用它,并更改默认值,以便它能够像导师指示的那样更早地检测到断开的连接

但我不完全理解导师的意思。如果我调用
SO\u KEEPALIVE
TCP\u keepnct
TCP\u KEEPIDLE
TCP\u KEEPINTVL
,导师说它将覆盖系统范围的变量(TCP\u KEEPALIVE\u time,TCP\u KEEPALIVE\u intvl,TCP\u KEEPALIVE\u probe) 它是否会影响其他线程/进程创建的其他套接字


它不会,
setsockopt
只影响作为参数传递给它的套接字。

setsockopt()
只影响给它的套接字。因此,否,在一个套接字上设置keep alive值不会影响其他套接字,或者系统作为一个整体设置revc()的超时,请检查documentation@Mannoj你的链接没有任何关联。如果你不这么认为,请解释。请注意:我最近发现,尽管tcp keep alive已设置且低于防火墙规则,但一些防火墙会切断连接,因此这可能不是一个完整的解决方案…@Mariotespoon tcp keep alives仍能检测到断开的连接。你说的是一个不同的问题,即通过路由器保持连接打开。没错,我只是想指出这一点,因为它毁了我的一位客户的一天(他错误地实施了重新连接,bc“这永远不会发生”):-)@MarioTheSpoon这不是第一次错误配置或不合规的网络硬件毁了某人的一天。这就是人们实现应用程序级心跳的原因——为了围绕这样的硬件工作。@MaximeGroushkin我将您的答案标记为已接受。但还有一个问题:以前,如果我单独使用recv(),当连接断开时,recv()不会返回。但是当我使用SO_KEEPALIVE设置sockopt()时,recv()会在超时过期时返回。recv()是否使用SO_KEEPALIVE执行某些操作?协议定义了一条消息(KEEPALIVE message)。但在某些情况下,信息只是从设备发送的。在正常情况下,客户机连接到服务器后,服务器只是等待来自客户机的消息。我必须确定客户端是否仍处于连接状态not@Joker那么听起来你应该使用一个超时。