我在C上编写了一个程序,客户端将一些信息发送到服务器。我使用TCP套接字。有时候服务器计算并应该将结果发送给客户端。如何检测服务器或客户端上的连接是否已损坏?
答案 0 :(得分:3)
您可能想尝试TCP Keepalive。
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9`
在上面的示例中,TCP保持活动计时器在7200秒的空闲时间之后启动。如果保持活动消息不成功,则以75秒的间隔重试它们。连续9次重试失败后,连接将被关闭。
通过将启动脚本放在/etc/init.d上,可以在启动时修改保持活动时间。
答案 1 :(得分:0)
我知道某个程序确定TCP连接已死的唯一方法是尝试在其上发送内容。尝试将超时或返回错误条件。因此,该程序不需要做任何特殊的事情 - 只需发送它旨在发送的东西。但是,它确实需要处理所有可能的错误条件。在超时时,它可以在有限的时间内重试或者确定连接已经死亡。如果多次发送相同的数据将是有害的,后一种情况是适当的。在此情况或错误情况之后,程序应关闭当前连接,并在适当时重新建立连接。
答案 2 :(得分:0)
TCP Keep-Alive是确定对等方是否已死的可靠方法。也就是说,如果对等应用程序退出而没有正确关闭打开的TCP连接。
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
了解如何使用setsockopt
调用为每个套接字启用tcp keep-alives(SO_KEEPALIVE)。
另一种方法是客户端和服务器应用程序定期同意心跳。未到达的心跳应该表明对方已经死亡。
答案 3 :(得分:0)
有一种方法可以在Linux上检测死套接字而不读取或写入死套接字:
uint
)文件描述符。readlink
文件/proc/[pid]/fd/[#hander]
。如果是套接字,它将返回类似socket:[#inode]
的字符串。/proc/net/tcp
,搜索具有该inode的行(第11列)。st
)列(第四列)。如果是0x07(关闭)或0x08(TIME_WAIT),则套接字已失效。