每个人都必须同意SO_REUSEADDR吗?

Kim*_*man 1 sockets tcp

我所见过的所有讨论都SO_REUSEADDR假设它是在同一个已知端口上创建和绑定TCP套接字的程序.

我有两个不同的程序使用相同的端口,我很好奇该机制如何工作 - 为了程序2分配一个端口程序1刚刚关闭,他们都必须SO_REUSEADDR在创建套接字后指定?

或者对其中一个人来说足够了吗?如果是这样的话,那么当它在TIME_WAIT状态中徘徊时,首先接受套接字的那个或者之后尝试打开它的那个?

这是Python中的一个小例子,希望能让案例更加清晰;

# 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()
Run Code Online (Sandbox Code Playgroud)

将one.py和two.py视为两个独立的代码库.

one.py和two.py都需要设置SO_REUSEADDR套接字选项,以便two.py能够容忍来自one.py的延迟TIME_WAIT套接字吗?

谢谢.

don*_*e26 5

回答你的问题.我相信在Linux上你必须SO_REUSEADDR 在要重用端口的程序中指定.非常简单.但是,在Microsoft Windows上,这是一个不同的故事.Microsoft 在MSDN上一个页面,其中包含SO_REUSEADDR和相关功能.