埠復用 SO REUSEADDR 是幹啥用的

2021-07-05 17:24:32 字數 633 閱讀 3646

如果埠復用了(設定了socket的so_reuseaddr選項),在乙個應用程式可以把n個套接字綁在乙個埠上而不出錯。那現在是不是可以從這些套接字中併發地讀取了?答案是否定的——測試結果是只有最後乙個套接字會正常接收資料。

埠復用最常用的用途應該是防止伺服器重啟時之前繫結的埠還未釋放。這種情況下如果設定了埠復用,則新啟動的伺服器程序可以直接繫結埠,直接接過前輩的槍。如果沒有設定埠復用,繫結會失敗,提示addr已經在使用中——那只好等等再重試了,麻煩!

最近上網亂看,發現還有其他用途,摘抄自非常經典的unpv1:

1、當有乙個有相同本地位址和埠的socket1處於time_wait狀態時,而你啟動的程式的socket2要占用該位址和埠,你的程式 就要用到該選項。 (這就是我說的情況啦)

2、so_reuseaddr允許同一port上啟動同一伺服器的多個例項(多個程序)。但每個例項繫結的 ip位址是不能相同的。在有多塊網絡卡或用ip 

alias技術的機器可以測試這種情況。

3、so_reuseaddr允許單個 程序繫結相同的埠到多個socket上,但每個socket繫結的ip位址不同。這和2很相似,區別請看unpv1。

4、so_reuseaddr允許完全相同的位址和埠的重複繫結。但這只用於udp的多播,不用於tcp。

套接字埠復用 SO REUSEADDR

下面建立的套接字都是tcp套接字 1.程序建立監聽套接字socket1,邦定乙個指定埠,並接受了若干連線。那麼程序建立另外乙個套介面socket2,並試圖邦定同乙個埠時候,bind錯誤返回 address already in use 即使使用了so reuseaddr 2.程序建立監聽套接字,邦定...

埠復用技術

內網主機埠 外網主機埠。訪問外網埠 內網主機埠。路由器上設定乙個埠對映。外部埠和內部埠一 一對應 外部埠和內部ip一 一對應 兩個程式,監聽相同的埠。埠復用技術中最重要的乙個函式是setsockopt setsockopt 函式,用於任意型別 任意狀態套介面的設定選項值。設定socket的so re...

Golang 埠復用測試

先給出結論 同乙個程序,使用乙個埠,然後連線關閉,大約需要30s後才可再次使用這個埠。首先使用埠9001連線服務端,傳送資料,然後關閉連線,接著再次使用埠9001連線服務端,如果連線失敗,間隔15s後,再次嘗試,最多嘗試3次,client package main import bufio fmt ...