【发布时间】:2012-01-20 08:59:20
【问题描述】:
我在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()
将 one.py 和 two.py 视为两个独立的代码库。
one.py 和 two.py 是否都需要设置 SO_REUSEADDR 套接字选项才能让 two.py 容忍来自 one.py 的延迟 TIME_WAIT 套接字?
谢谢。
【问题讨论】:
-
unixguide.net/network/socketfaq/4.5.shtml 我猜你所有的程序都应该使用 SO_REUSEADRR。
-
@JeremyD -- 谢谢!我认为这意味着只有第二个程序需要 SO_REUSEADDR?我还不是很清楚。
-
@VladLazarenko -- 我不这么认为。我想我了解 SO_REUSEADDR 的用途,我在问是否需要多方同意才能使其正常工作。