我在SO_REUSEADDR
上看到的所有讨论都假设它是创建并绑定到已知端口上的TCP套接字的相同程序。
我有两个不同的程序使用相同的端口,我很好奇这个机制是如何工作的 - 为了让程序2分配一个刚刚关闭的端口程序,他们都必须指定{{1}他们创建套接字后?
或者对其中一个人来说还够吗?如果是这样的话,那么当它在TIME_WAIT状态中徘徊时,首先接受套接字的那个或者之后尝试打开它的那个?
这是Python中的一个小例子,希望能让案例更加清晰;
SO_REUSEADDR
将one.py和two.py视为两个独立的代码库。
one.py和two.py都需要设置# one.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050)) # Assuming 5050 is available
sys.exit(1) # Assuming s enters TIME_WAIT
# two.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050))
s.listen()
套接字选项,以便two.py能够容忍来自one.py的延迟TIME_WAIT套接字吗?
谢谢。
答案 0 :(得分:5)
回答你的问题。我相信Linux上的 你必须在想要重用端口的程序中指定SO_REUSEADDR
ONLY 。非常简单。但是,在Microsoft Windows上,这是一个不同的故事。 Microsoft a page on MSDN涵盖了SO_REUSEADDR和相关功能。
答案 1 :(得分:0)
我认为是的,所有使用相同端口的程序都应使用SO_REUSEADDR
。
因为重用端口的超时是内核的事情。
(但我可能错了)。
答案 2 :(得分:0)
侦听套接字后面的系统调用是bind()
,并且您无法同时绑定到同一地址上的同一端口:操作系统禁止该操作。 SO_REUSEADDR
告诉程序退出后其他套接字可能会监听。但只要它没有退出,它就是这个端口的专有权。
答案 3 :(得分:0)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0))
您可以通过将 SO_LINGER 套接字选项设置为零来突然终止 TCP 协商流程的 TIME_WAIT 状态。
当你允许两种状态时很好,ESTABLISHED 或没有。