1、
一般來說
,乙個埠釋放後會等待兩分鐘之後才能再被使用
,so_reuseaddr
是讓埠釋放後立即就可以被再次使用。
so_reuseaddr
用於對tcp
套接字處於
time_wait
狀態下的
socket
,才可以重複繫結使用。server
程式總是應該在呼叫
bind()
之前設定
so_reuseaddr
套接字選項。
tcp,
先呼叫close()
的一方會進入
time_wait狀態
2、so_reuseaddr
和so_reuseport
so_reuseaddr
提供如下四個功能:
so_reuseaddr
允許啟動乙個監聽伺服器並**其眾所周知埠
,即使以前建立的將此埠用做他們的本地埠的連線仍存在。這通常是重啟監聽伺服器時出現
,若不設定此選項
,則bind
時將出錯。
so_reuseaddr
允許在同一埠上啟動同一伺服器的多個例項
,只要每個例項**乙個不同的本地ip
位址即可。對於
tcp,
我們根本不可能啟動**相同ip
位址和相同埠號的多個伺服器。
so_reuseaddr
允許單個程序**同一埠到多個套介面上
,只要每個**指定不同的本地ip
位址即可。這一般不用於
tcp伺服器。
so_reuseaddr
允許完全重複的**:當乙個
ip位址和埠繫結到某個套介面上時
,還允許此ip
位址和埠**到另乙個套介面上。一般來說
,這個特性僅在支援多播的系統上才有
,而且只對udp
套介面而言(
tcp不支援多播)。
so_reuseport
選項有如下語義:
此選項允許完全重複**
,但僅在想**相同ip
位址和埠的套介面都指定了此套介面選項才行。
如果被**的ip
位址是乙個多播位址
,則so_reuseaddr
和so_reuseport
等效。
使用這兩個套介面選項的建議:
在所有tcp
伺服器中
,在呼叫bind
之前設定
so_reuseaddr
套介面選項;
當編寫乙個同一時刻在同一主機上可執行多次的多播應用程式時
,設定so_reuseaddr選項,
並將本組的多播位址作為本地ip
位址**。
if (setsockopt(fd, sol_socket, so_reuseaddr,
(const void *)&noptval , sizeof(int)) < 0) ...
附
q:編寫
tcp/sock_stream
服務程式時,
so_reuseaddr
到底什麼意思?
a:這個套接字選項通知核心,如果埠忙,但
tcp狀態位於
time_wait
,可以重用埠。如果埠忙,而
tcp狀態位於其他狀態,重用埠時依舊得到乙個錯誤資訊,指明
"位址已經使用中
"。如果你的服務程式停止後想立即重啟,而新套接字依舊使用同一埠,此時
so_reuseaddr
選項非常有用。必須意識到,此時任何非期望資料到達,都可能導致服務程式反應混亂,不過這只是一種可能,事實上很不可能。
so_reuseaddr
so_reuseaddr
選項。【2】
【1】
】 以下部落格對這個問題進行了對答式的解答:
】
UNIX網路程式設計之環境配置
開始學習 unix網路程式設計 輸入第乙個程式後,遇到各種錯誤,先將解決方案記錄如下。mkdir home yourname download 建立存放壓縮檔案的目錄 tar xzvf unpv13e.tar.gz 解壓 ls al 檢視該目錄下的檔案 cd unpv13e 進入unpv13e ca...
unix網路程式設計之一TCP UDP
網路通訊中最常用的就是tcp udp。2種協議個有一些特點如下 udp是一種簡單的傳輸協議。應用程式寫資料到udp套介面。然後由它封裝成ipv4或ipv6的資料報,再傳送到目的位址。它不提供可靠性。它與伺服器不存在長期的連線關係。tcp是一種面向連線的協議。提供 可靠性 先連線,再傳輸資料。傳送資料...
unix下網路程式設計之I O復用(五)
本章節是用基本的linux unix基本函式加上select呼叫編寫乙個完整的伺服器和客戶端例子,可在linux ubuntu 和unix freebsd 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,然後輸出到客戶端 客戶端收到服務端的響應,輸出這...