2009-02-23 60 views
13

我已經使用SO_REUSEADDR有我的服務器被終止重新啓動,並抱怨套接字已被使用。我想知道是否有其他用途SO_REUSEADDR?有沒有人用上述目的以外的套接字選項?SO_REUSEADDR的用法?

+2

謝謝,我想知道完全一樣的東西。相關問題:爲什麼SO_REUSEADDR不是默認的? – 2009-02-23 15:33:03

回答

20

對於TCP:,主要目的是在同一個地址上重新啓動關閉/關閉的進程。

該標誌是必需的,因爲端口進入TIME_WAIT狀態以確保所有數據都被傳輸。

如果兩個套接字綁定到相同的接口和端口,並且是同一個多播組的成員,則數據將被傳遞到兩個套接字。

我猜測另一種用法是試圖攔截數據的安全攻擊。

Source


對於UDP: SO_REUSEADDR用於組播

多於一個進程可能如果綁定結合 相同SOCK_DGRAM UDP端口() 是前面是:

int one = 1; setsockopt的(襪子, SOL_SOCKET,SO_REUSEADDR,&一個, 的sizeof(之一))

在這種情況下,每個傳入的多播 或廣播UDP數據報註定 共享端口被遞送到綁定到端口的所有 插座。

Source

+2

需要說明。監聽端口不會進入TIME_WAIT,但可以接受連接。 TIME_WAIT不能保證所有的數據都被傳輸,這是爲了避免混淆同一端點之間的後續連接。 – EJP 2013-01-02 06:32:02

5

的另一個主要用途是允許多個套接字到bind()到UDP相同的端口。您可能不會想到會出現這種情況,但有時多個應用程序可能需要使用給定的端口號監聽廣播/多播地址。它還允許綁定到通配符地址,同時綁定到特定的地址。例如,Apache可能綁定到*:80和10.11.12.13:80