端口是否应该在关闭后立即可用?
Should ports be available immediately after closing?
我一直在 Python 在两个客户端和一个服务器之间编写一个简单的 TCP/IP 服务器。目前,当我尝试在同一端口关闭后立即重新运行该程序时,shell 通知我该端口正忙。
我认为这应该表明某处没有正确关闭连接,但我似乎找不到任何挥之不去的套接字。
我的问题是,这个假设是否正确?我是打开一个套接字还是这种行为正常?如果是这样,有人对我如何找到它有任何建议吗?
在服务器端,我打开了两个连接并将它们放入一个元组中,这样我就可以循环访问它们:
(self.con1, rec1) = self.s.accept()
(self.con2, rec2) = self.s.accept()
self.con = (self.con1, self.con2)
以下代码是否足以关闭这些连接?
self.con1.close()
self.con2.close()
有没有可能将连接放入元组中会创建可能挥之不去的连接的新副本?
这是正常的。 TCP 为持续几分钟(最大段生命周期的两倍)的端口定义了 TIME_WAIT 状态,在此期间它们不能被重新使用。这是一种数据完整性措施。您可以通过在绑定套接字之前设置 SO_REUSEADDR
选项来克服它。
我一直在 Python 在两个客户端和一个服务器之间编写一个简单的 TCP/IP 服务器。目前,当我尝试在同一端口关闭后立即重新运行该程序时,shell 通知我该端口正忙。
我认为这应该表明某处没有正确关闭连接,但我似乎找不到任何挥之不去的套接字。
我的问题是,这个假设是否正确?我是打开一个套接字还是这种行为正常?如果是这样,有人对我如何找到它有任何建议吗?
在服务器端,我打开了两个连接并将它们放入一个元组中,这样我就可以循环访问它们:
(self.con1, rec1) = self.s.accept()
(self.con2, rec2) = self.s.accept()
self.con = (self.con1, self.con2)
以下代码是否足以关闭这些连接?
self.con1.close()
self.con2.close()
有没有可能将连接放入元组中会创建可能挥之不去的连接的新副本?
这是正常的。 TCP 为持续几分钟(最大段生命周期的两倍)的端口定义了 TIME_WAIT 状态,在此期间它们不能被重新使用。这是一种数据完整性措施。您可以通过在绑定套接字之前设置 SO_REUSEADDR
选项来克服它。