我在C语言上编写了一个程序,在该程序中客户端发送一次信息给服务器。我使用了TCP套接字。有时候,服务器会进行计算并应该将结果发送给客户端。如何检测到服务器或客户端的连接是否中断?
# 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`
ECONNRESET
错误。 - user207421在Linux上,有一种方法可以检测死亡的套接字,而不需要读取或写入它们:
uint
)文件描述符。readlink
文件 /proc/[pid]/fd/[#hander]
。如果是一个套接字,它将返回类似于 socket:[#inode]
的字符串。/proc/net/tcp
,查找包含该 inode(第11列)的行。st
)列(第4列)。如果是0x07(关闭)或0x08(TIME_WAIT),则该套接字已死亡。TCP Keep-Alive是一种可靠的方式,用于确定对等方是否已经关闭连接。这是指如果对等方应用程序在没有正确关闭打开的TCP连接情况下退出。
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
注意如何使用setsockopt
调用为每个套接字启用tcp keep-alives(SO_KEEPALIVE)。
另一种方法是客户端和服务器应用程序在规律的时间间隔内达成心跳协议。如果心跳未到达,则应表明对等方已死亡。