Linux網路程式設計

2022-03-24 13:23:05 字數 3451 閱讀 4239

第二章linux網路程式設計

2.1客戶——伺服器模型

目前大多數網路應用程式在編寫時都採用客戶—伺服器模型,假設一端是客戶,另一端是伺服器,讓伺服器提供給客戶一定的服務內容。它要求有一方(伺服器方)在啟動執行程式後(無限期地)等待其他客戶端程式與之通訊。這裡可以再分為兩種具體型別:並髮型互動與重複型互動。

(1)並髮型互動。在並髮型互動模式下,程式的主要運作步驟如下:

·等待乙個客戶請求的到來;

·生成乙個新的程序或者任務來處理這個客戶請求,同時這裡還可以接收其他客戶的請求,處理結束後,終止這個程序;

·反饋客戶端;

·等待新的客戶請求的到來並進行下一次服務,如此迴圈運作。

(2) 重複型互動。重複型互動模式下,程式的主要運作步驟如下:

·等待乙個客戶請求的到來;

·處理客戶的請求,對客戶進行服務;

·給客戶反饋資訊,服務結束;

·等待下乙個請求到來,如此迴圈。

這裡重複型互動的缺點就是在伺服器給乙個客戶處理請求服務的時候,不能接收和處理其他客戶的請求;而並髮型互動就可以解決這個問題,但要多執行緒作業系統的支援。一般來說,udp 伺服器採用重複型互動,tcp 伺服器採用並髮型互動。 客戶/伺服器模式要求每個應用程式由兩個部分組成:乙個部分負責啟動通訊,另乙個部分負責對它進行應答。它們通常是執行在不同的主機上,分別被稱為客戶機和伺服器。伺服器並不特定指網路上的一台機器,它可以是網路上可提供服務的任何程式,同樣,客戶機也是指使用者為了得到某種服務所需要執行的應用程式。由於客戶端和伺服器端在網路通訊中表現出來的不同的功能,對它們程式設計要採用不同的演算法。

2.2面向連線和無連線的客戶—伺服器

在設計客戶—伺服器軟體時,必須在兩種型別的互動中做出選擇:無連線的風格或面向連線的風格。這兩種風格的互動直接對應於 tcp/ip 協議族所提供的兩個主要的傳輸協議。如果客戶和伺服器使用使用者資料報(udp)進行通訊,那麼互動就是無連線的;如果使用傳輸控制協議(tcp),則互動就是面向連線的。由於面向連線風格的互動協議使程式設計更簡單,程式更可靠,因此採用tcp協議的客戶—伺服器模型是我們的首選。

2.3 tcp連線通訊過程

tcp是一種面向連線的、可靠的位元組流傳輸協議,通訊之前,雙方之間必須建立一條連線,通訊結束後再釋放。

為了建立一條可靠的連線,tcp採用三次握手的方式:

(1)客戶機(請求端)向伺服器發出同步段(syn),請求接入。

(2)伺服器向客戶機發出同步—應答段(syn—ack)。一方面作為對客戶請求接入的響應,另一方面要求客戶端也進行接入。

(3)客戶機向伺服器再發出應答段(ack)。作為對伺服器所發請求接入的響應。

終止乙個tcp連線共要經過4次握手:

(1)客戶機向伺服器發出關閉段(fin)。此時,客戶機不能再向遠方伺服器傳送資料,但是可以繼續接收資料。

(2)伺服器向客戶機發出關閉—應答段。此時伺服器還可以向客戶機傳送資料,即接入處於「半關閉」狀態。

(3)伺服器向客戶機發出關閉段(fin),關閉本側的接入,仍可接收資料。一方面作為客戶關閉接入的響應,另一方面要求客戶端也須關閉接入。此時,伺服器不能再傳送資料。

(4)客戶機為響應伺服器的關閉,向伺服器發出關閉—應答段。

2.4tcp協議的socket程式設計

socket程式設計簡單的說就是使兩台或多台聯網的計算機相互交換資料。

2.4.1 tcp套介面連線中的主要函式的呼叫

tcp 套介面連線中的主要呼叫的函式有socket,bind,connect,write,listen,close等。tcp/ip協議的客戶/伺服器機制工作過程如下圖所示:

2.4.2 linux中套介面的資料結構

套介面資料結構同時與使用它的網路有關。在linux中,每一種協議都有自己的網路位址資料結構,這些結構以sockaddr_開頭,不同的字尾表示不同的協議,如ipv4對應的是sockaddr_in。

2.5程式設計演算法實現

2.5.1客戶端的演算法

客戶可以按照以下演算法構造與某個伺服器的連線並與該伺服器通訊。

(1)找到與其通訊的伺服器的ip位址和協議埠號;

(2)分配套接字;

(3) 指明此連線需要在本地機器中的、任意的、未使用的協議埠,並允許tcp選擇乙個這樣的埠;

(4)將這個套接字連線到伺服器;

(5)使用應用級協議與伺服器進行通訊(此常包含傳送請求和等待應答);

(6)關閉連線。  

2.5.2服務端的演算法

(1)併發伺服器

伺服器在乙個時刻可以處理多個請求的伺服器,稱為併發伺服器。我們採用併發的、面向連線伺服器的演算法,下面給出了併發伺服器使用面向連線協議的演算法步驟:

主 1.建立套接字並將其繫結到所提供服務的設定的位址上。該套接字保持

非連線的。

主2.將該埠設定為被動模式,使其準備為伺服器所用。

主3.反覆呼叫accept以便接收來自客戶的下乙個連線請求,並建立新的從

執行緒或程序來處理響應。

從1.由主線程傳遞來得連線請求(即針對連線的套接字開始)。

從2.用該連線與客戶進行互動:讀取請求並發回響應。

從3.關閉連線並退出。在處理完來自客戶的所有請求後,從執行緒就退出。

(2)多執行緒與多程序併發伺服器

linux提供了兩種形式的併發性——程序和執行緒,所以有兩種常見的主—從模式實現:一種是伺服器建立多個程序,每個程序都有乙個執行執行緒。另一種實現是,伺服器在乙個程序中建立多個執行執行緒。

(3)依賴單執行緒和非同步i/o處理多個連線的伺服器

在單執行緒實現中,乙個執行執行緒管理多個連線。它通過使用非同步i/o來達到表面上的併發性。伺服器反覆地在它所開啟的連線上等待i/o,收到請求便進行處理。由於單個執行緒處理所有的連線,它就可以在多個連線之間共享資料。然而因為伺服器只有乙個執行緒,即使在乙個具有多個處理器的計算機上,它處理請求的速度不會比迴圈伺服器更快。應用程式必須共享資料或者對每個請求的處理時間必須很短,只要在這種情況下這種伺服器實現方案才是可取的。

Linux網路程式設計

linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...

linux 網路程式設計

當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...

linux 網路程式設計

套接字程式設計 struct sockaddr unsigned short sa family 位址協議,ipv4 tcp ip af inet,ipv6 af inet6 char sa data 14 14位元組的位址協議 struct sockaddr in unsigned short s...