每个人都必须同意SO_REUSEADDR吗?

时间:2011-12-14 15:20:58

标签: sockets tcp

我在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套接字吗?

谢谢。

4 个答案:

答案 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 或没有。