2011-12-14 66 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

相關問題