2009年5月6日 星期三

解決Socket連續Bind同一個Port的問題

在IHU的程式碼中, 在建立UDP時, 看到了以下的部分
int on=1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on));

這樣的設定是可以讓不同的應用程式在同時間(應該是關掉之後馬上開的情況, 請參考下面解說)使用相同的port並且執行成功…

其使用方式,
只需要在建立一個Socket之後,
使用setsockopt function就可以達到,
短時間內連續bind同一個port的功能了!

另外一提的是,如果udp, 與tcp使用相同的port,是不需要使用這一個功能的,因為tcp, udp的協定本來就不同,所以不會產生衝突哩

1、當有一個有相同本地地址和port的socket1處於TIME_WAIT狀態時,而你啟動的程序的socket2要佔用該地址和端口,你的程序就要用到該選項。
2、SO_REUSEADDR允許同一port上啟動同一服務器的多個實例(多個進程)。但每個實例綁定的IP地址是不能相同的。在有多塊網卡或用IP Alias技術的機器可以測試這種情況。
3、SO_REUSEADDR允許單個進程綁定相同的端口到多個socket上,但每個socket綁定的ip地址不同。這和2很相似,區別請看UNPv1。
4、SO_REUSEADDR允許完全相同的地址和端口的重複綁定。但這只用於UDP的多播,不用於TCP(應該也包含SCTP)。

參考資料:
解決Socket連續Bind同一個Port的問題
socket編程:SO_REUSEADDR例解

沒有留言: