關於linux socket 程式設計 埠復用的理解

2021-07-10 07:45:08 字數 1545 閱讀 2102

在linux socket網路程式設計中,大規模併發tcp或udp連線時,經常會用到埠復用:

int opt = 1;

if(setsockopt(sockfd, sol_socket,so_reuseaddr, (const

void *) &opt, sizeof(opt)))

那麼什麼是埠復用呢,如何理解呢,可以解釋成如下:

在a機上進行客戶端網路程式設計,假如它所使用的本地埠號是1234,如果沒有開啟埠復用的話,它用本地埠1234去連線b機再用本地埠連線c機時就不可以,若開啟埠復用的話在用本地埠1234訪問b機的情況下還可以用本地埠1234訪問c機。若是伺服器程式中監聽的埠,即使開啟了復用,也不可以用該埠望外發起連線了。

so_reuseaddr提供如下四個功能:

so_reuseaddr允許啟動乙個監聽伺服器並**其眾所周知埠,即使以前建立的將此埠用做他們的

本地埠的連線仍存在。這通常是重啟監聽伺服器時出現,若不設定此選項,則bind時將出錯。

so_reuseaddr允許在同一埠上啟動同一伺服器的多個例項,只要每個例項**乙個不同的本地ip位址

即可。對於tcp,我們根本不可能啟動**相同ip位址和相同埠號的多個伺服器。

so_reuseaddr允許單個程序**同一埠到多個套介面上,只要每個**指定不同的本地ip位址即

可。這一般不用於tcp伺服器。

口**到另乙個套介面上。一般來說,這個特性僅在支援多播的系統上才有,而且只對udp套

介面而言(tcp不支援多播)。

so_reuseport選項有如下語義:

此選項允許完全重複**,但僅在想**相同ip位址和埠的套介面都指定了此套介面選項才行。

如果被**的ip位址是乙個多播位址,則so_reuseaddr和so_reuseport等效。

使用這兩個套介面選項的建議:

在所有tcp伺服器中,在呼叫bind之前設定so_reuseaddr套介面選項;
當編寫乙個同一時刻在同一主機上可執行多次的多播應用程式時,設定so_reuseaddr選項,並將本組的多播位址作為本地ip位址**。

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 選項非常有用。必須意識到,此時任何

非期望資料到達,都可能導致服務程式反應混亂,不過這只是一種可能,事實上很不可能。

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...