【发布时间】:2013-04-27 20:37:38
【问题描述】:
在一个用 Linux C 编写的 tcp 程序中
我想关闭一个 tcp 连接
我用close(sockfd)
我注意到这个函数将向另一个对等方发起一个 FIN/ACK 数据包
但是如果由于网络问题或 tcp 序列号不一致,其他对等方没有响应 ACK(例如,其他对等方的 tcp 堆栈崩溃)
然后似乎tcp连接无法关闭
它将始终处于 FIN_WAIT1 状态
如何处理? 这种情况下如何关闭tcp连接?
【问题讨论】:
-
然后关闭部分将再次尝试发送
FIN,然后再发送几次,直到最终超时,close返回错误。 -
在我看来
close()不是阻塞式的,所以调用后无法返回错误。如何得到错误? -
@user1944267 套接字是阻塞的还是非阻塞的?
-
所以你的意思是
close()的行为取决于套接字是否阻塞,如果不是,close()不会返回-1? -
close() 在阻塞或非阻塞模式下都是异步的,除非您设置了延迟超时,在这种情况下,它要么阻塞直到超时,要么(可能)设置 errno = EAGAIN 如果必填。
标签: networking tcp network-programming