我打开了数千个套接字,有时程序崩溃了,给我留下了更少的可用套接字。有没有办法清洁那些悬挂的插座?
套接字最终被Unix内核关闭;崩溃的程序与没有close()/shutdown()
调用的正常程序退出没什么不同。
您的问题可能与TCP / IP状态机的TIME_WAIT状态有关,应使用SO_REUSEADDR选项解决。一种确认方法是等待大约5分钟,然后在崩溃后再次开始。如果发现现在有足够的套接字可用,则应研究TIME_WAIT逻辑并加以解决。如果等待技巧不能解决您的问题,则程序中可能存在其他问题,需要确定该问题。
这是有关TIME_WAIT主题及其对协议和可伸缩客户端服务器系统的设计含义的很好的阅读
从中快速摘录两个,以供参考,
TIME_WAIT通常也称为2MSL等待状态。这是因为转换为TIME_WAIT的套接字在此停留的时间为持续时间的2 x最大段生存时间。MSL是任何段(出于所有目的和目的,构成TCP协议一部分的数据报)在被丢弃之前可以在网络上保持有效的最长时间。此时间限制最终受用于传输TCP段的IP数据报中的TTL字段限制。不同的实现为MSL选择不同的值,并且常见值为30秒,1分钟或2分钟。RFC 793将MSL指定为2分钟,Windows系统默认为该值,但可以使用TcpTimedWaitDelay注册表设置进行调整。
(附:因此,4+1
等待上面建议的考试等待的时间)
更改2MSL延迟通常是整个计算机范围内的配置更改。您可以改为尝试使用SO_REUSEADDR套接字选项在套接字级别上解决TIME_WAIT。这允许在已经存在具有相同地址和端口的现有套接字的同时创建套接字。新的套接字实质上会劫持旧的套接字。您可以使用SO_REUSEADDR允许在具有相同端口的套接字已经在TIME_WAIT中的同时创建套接字,但这也会引起诸如拒绝服务攻击或数据盗窃之类的问题。
本文介绍了另一种方法。但这伴随着其他警告。
还有一种终止TCP连接的方法,即中止连接并发送RST而不是FIN。通常,这可以通过将SO_LINGER套接字选项设置为0来实现。这将导致丢弃待处理数据,并使用RST终止连接,而不是发送待处理数据,并使用FIN干净地关闭连接。重要的是要认识到,当连接中止时,对等点之间可能正在流动的任何数据都将被丢弃,而RST将被立即传递。通常是一个错误,表示“对等方已重置连接”这一事实。远程对等方知道连接已中止,并且任何对等方均未输入TIME_WAIT。
在使用这些方案之前,先了解一下TCP机器的行为是一个好主意,这样您就不会无意间引入其他情况,这些情况以后需要进行调试。所以至少要完整地阅读该文章:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句