如何在C上检测Linux中的TCP死连接?

时间:2014-05-11 12:26:38

标签: c linux tcp

我在C上编写了一个程序,客户端将一些信息发送到服务器。我使用TCP套接字。有时候服务器计算并应该将结果发送给客户端。如何检测服务器或客户端上的连接是否已损坏?

4 个答案:

答案 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上检测死套接字而不读取或写入死套接字:

  1. 从套接字处理程序中获取数字(uint)文件描述符。
  2. readlink文件/proc/[pid]/fd/[#hander]。如果是套接字,它将返回类似socket:[#inode]的字符串。
  3. 阅读/proc/net/tcp,搜索具有该inode的行(第11列)。
  4. 读取该行的状态(st)列(第四列)。如果是0x07(关闭)或0x08(TIME_WAIT),则套接字已失效。