UNIX網路程式設計之SO REUSEADDR關鍵字

2021-07-10 23:35:38 字數 2090 閱讀 9499

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 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,然後輸出到客戶端 客戶端收到服務端的響應,輸出這...