我正在实现tcp服务器套接字。服务器与另一个设备中的客户端套接字通信。
问题是:如果连接突然中断(电缆被移除),recv()函数就不会返回。
我不能实现乒乓(心跳)机制,因为我不控制设备的实现。
在互联网上搜索了一段时间之后,我发现了这个教程:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
但我不完全理解家教。如果我在SO_KEEPALIVE、TCP_KEEPCNT、TCP_KEEPIDLE、TCP_KEEPINTVL上调用setsockopt(),导师说它将覆盖系统范围内的变量(tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes)。
它是否影响由另一个线程/进程创建的其他套接字?
发布于 2020-03-24 02:15:48
TCP保持活动功能确实允许您检测断开的连接.您需要显式地为您的套接字启用它,并更改默认设置,以便它能够更早地检测到断开的连接,就像您的导师所指示的那样。
,但我不完全理解导师的意思。如果我调用
setsockopt()
onSO_KEEPALIVE
,TCP_KEEPCNT
,TCP_KEEPIDLE
,TCP_KEEPINTVL
,导师说它会覆盖系统范围的变量(tcp_keepalive_time,tcp_keepalive_intvl,tcp_keepalive_probes),它会影响其他线程/进程创建的套接字吗?
没有,setsockopt
只影响作为参数传递给它的套接字。
发布于 2020-03-24 00:23:21
TCP没有提供检测未发送端的断开连接的好方法。如果设备使用的协议没有为服务器提供检测断开连接的任何方式,则该协议将被破坏。你所能做的就是实现一个接收超时,但这种情况很糟糕。
协议有文件吗?它说要做什么?
https://stackoverflow.com/questions/60824773
复制