我在 SO_REUSEADDR
上看到的所有讨论假设它是在已知端口上创建并绑定(bind)到 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套接字?
谢谢。
最佳答案
回答你的问题。我相信在Linux上,您必须在想要重用端口的程序中ONLY指定SO_REUSEADDR
。很简单。然而在 Microsoft Windows 上,情况就不同了。微软有 a page on MSDN涵盖 SO_REUSEADDR 和相关功能。
关于sockets - 每个人都必须同意 SO_REUSEADDR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506971/