1、一般來說,一個端口釋放後會等待兩分鐘之後才能再被使用,SO_REUSEADDR是讓端口釋放後立即就可以被再次使用。
SO_REUSEADDR用於對TCP套接字處於TIME_WAIT狀態下的socket,才可以重復綁定使用。server程序總是應該在調用bind()之前設置SO_REUSEADDR套接字選項。TCP,先調用close()的一方會進入TIME_WAIT狀態
2、SO_REUSEADDR和SO_REUSEPORT
SO_REUSEADDR提供如下四個功能:
當有一個有相同本地地址和端口的socket1處於TIME_WAIT狀態時,而你啟動的程序的socket2要占用該地址和端口,你的程序就要用到該選項。這通常是重啟監聽服務器時出現,若不設置此選項,則bind時將出錯。
SO_REUSEADDR允許在同一端口上啟動同一服務器的多個實例(多個進程),只要每個實例捆綁一個不同的本地IP地址即可。對於TCP,我們根本不可能啟動捆綁相同IP地址和相同端口號的多個服務器。
SO_REUSEADDR允許單個進程捆綁同一端口到多個套接口上,只要每個捆綁指定不同的本地IP地址即可。這一般不用於TCP服務器。
SO_REUSEADDR允許完全相同的地址和端口的重復綁定。但這只用於UDP的多播,不用於TCP(TCP不支持多播)。
SO_REUSEPORT選項有如下語義:
此選項允許完全重復捆綁,但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項才行。
如果被捆綁的IP地址是一個多播地址,則SO_REUSEADDR和SO_REUSEPORT等效。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/