Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 端口是否应在关闭后立即可用?_Sockets_Tcp_Port - Fatal编程技术网

Sockets 端口是否应在关闭后立即可用?

Sockets 端口是否应在关闭后立即可用?,sockets,tcp,port,Sockets,Tcp,Port,我一直在用Python在两个客户端和一个服务器之间编写一个简单的TCP/IP服务器。当前,当我尝试在同一端口关闭后立即重新运行程序时,shell会通知我端口正忙 我认为这应该表明某种程度上没有正确地关闭某个地方的连接,但我似乎找不到任何延迟的套接字 我的问题是,这个假设正确吗?我是开着插座还是这种行为正常?如果是的话,有人对我如何找到它有什么建议吗 在服务器端,我打开两个连接并将它们放入一个元组中,这样我就可以通过一个循环遍历它们: (self.con1, rec1) = self.s.

我一直在用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\u REUSEADDR
选项来克服此问题。

SO\u REUSEADDR
/
SO\u REUSEPORT
允许您使用仍在等待时间内的端口。为了避免等待时间,您可以使用
SO\u LINGER
在关闭时禁用延迟功能,但这并不总是有效的。另一个选项是仅使用
shutdown(SD\u RECEIVE)
,而不使用
shutdown(SD\u SEND)
shutdown(SD\u两者)
。如果先关闭连接端并发送
FIN
,您将进入
TIME\u WAIT
。但是你不应该避免时间等待。在99.9999999%的情况下,它的存在是为了保护会话不被破坏。@RemyLebeau SO_REUSEPORT是用于UDP的,如果我没记错的话,确实是用于多播的。与时间无关,请等待。避免等待时间的方法是在接收第一次关闭的一端,这是支持连接池的另一个论点
shutdown()
与此没有多大关系。我从来没有发布过这么长的帖子,因为我不认为任何地方的任何人都应该把它弄糟。
SO\u REUSEPORT
也可以用于TCP。它允许多个线程/进程在同一端口上侦听,每个线程/进程调用
accept()
。他们中的任何一个都可以接受新客户。用于池和负载平衡。至于
TIME\u WAIT
只有当您是第一个发送
FIN
的方时,您才可以输入它。无
FIN
等待时间
。当然,跳过
FIN
对另一方不好。