2011-12-14 67 views
1

我在SO_REUSEADDR上看到的所有讨论都假定它是创建并绑定到已知端口上的TCP套接字的相同程序。每个人都必须同意SO_REUSEADDR吗?

我有两个不同的程序使用相同的端口,我很好奇这个机制是如何工作的 - 为了让程序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套接字设置?

谢谢。

+1

http://www.unixguide.net/network/socketfaq/4.5.shtml 我想你所有的程序都应该使用SO_REUSEADRR。 – 2011-12-14 15:26:38

+0

[SO_REUSEADDR?的使用?]的可能重复(http://stackoverflow.com/questions/577885/uses-of-so-reuseaddr) – 2011-12-14 15:28:16

+0

@JeremyD - 谢谢!我认为只有第二个程序需要SO_REUSEADDR?我仍然不完全清楚。 – 2011-12-14 15:29:06

回答

0

我认为是的,所有使用相同端口的程序都应该使用SO_REUSEADDR

因为重用端口的超时是内核事情。

(但我可能是错的)。

0

侦听套接字后面的系统调用为bind(),并且无法同时绑定到同一地址上的同一端口:操作系统禁止这种情况。 SO_REUSEADDR表示程序退出后,其他套接字可能会侦听。但只要它没有退出,它就是这个港口的专利。

5

回答你的问题。我相信,在Linux上的您必须在要重新使用端口的程序中指定SO_REUSEADDR仅限。很简单。但在Microsoft Windows上,这是另一回事。微软拥有覆盖SO_REUSEADDR和相关功能的a page on MSDN

相关问题