客户端先关闭套接字,当没有太多的数据从服务器,tcp连接关闭是可以的,如:
FIN -->
<-- ACK
<-- FIN, ACK
ACK -->
当服务器忙于发送数据时:
FIN -->
<-- ACK,PSH
RST -->
服务器连接进入CLOSE_WAIT状态,并长时间挂起。
这里的问题是什么?客户端相关还是服务器相关?这发生在Redhat5的本地套接字上。
这个article讨论了为什么发送“RST”,但我不知道为什么服务器连接在CLOSE_WAIT上卡住,并且不发送FIN。
[EDIT]忽略了最重要的信息,这是qemu的slirp网络仿真出现的问题,似乎是处理紧密连接的slirp bug问题。
3条答案
按热度按时间3pmvbmvn1#
这意味着流中还有未读的数据,客户端尚未完成阅读。
您可以通过使用
SO_LINGER
选项强制关闭它。Linux的Here's relevant documentation(另请参见选项本身here),Win32的[这里是匹配的函数2]。服务器端保持打开状态,因此您可以在服务器端尝试禁用
SO_LINGER
。q43xntqr2#
这可能意味着服务器还没有关闭套接字。你可以很容易地通过使用“lsof”来列出该进程打开的文件描述符来判断这一点,其中包括TCP套接字。修复方法是让进程在完成时总是关闭套接字(即使在错误情况下等)
up9lanfz3#
这是qemu的已知defect。