linux網路伺服器模型

2021-06-27 13:29:36 字數 1835 閱讀 9146

linux系統網路伺服器模型主要有兩種:併發伺服器和迴圈伺服器。所謂併發伺服器就是在同乙個時刻可以處理來自多個客戶端的請求;迴圈伺服器是指伺服器在同一時刻指可以響應乙個客戶端的請求。而且對於tcp和udp套接字,這兩種伺服器的實現方式也有不同的特點。 

首先tcp伺服器接受乙個客戶端的連線請求,處理連線請求,在完成這個客戶端的所有請求後斷開連線,然後再接受下乙個客戶端的請求。 

建立tcp迴圈伺服器的演算法如下: 

socket(……);   //建立乙個tcp套接字 

bind(……);      //邦定公認的埠號 

listen(……);  //傾聽客戶端連線 

while(1)          //開始迴圈接收客戶端連線 

close(……);   //關閉當前客戶端的連線,準備接收下乙個客戶端連線 

}tcp迴圈伺服器一次只處理乙個客戶端的請求,如果有乙個客戶端占用伺服器不放時,其它的客戶機連線請求都得不到及時的響應。因此,tcp伺服器一般很少用迴圈伺服器模型的。 

併發伺服器的思想是每乙個客戶端的請求並不由伺服器的主程序直接處理,而是伺服器主程序建立乙個子程序來處理。 

建立tcp併發伺服器的演算法如下: 

socket(……); //建立乙個tcp套接字 

bind(……);    //邦定公認的埠號 

listen(……);//傾聽客戶端連線 

while(1)       //開始迴圈接收客戶端的接收 

close(……);  //關閉子程序處理的客戶端連線 

exit(……) ;//終止該子程序 

} close(……);           //父程序關閉連線套接字描述符,準備接收下乙個客戶端連線 

} tcp併發伺服器可以解決tcp迴圈伺服器客戶端獨佔伺服器的情況。但同時也帶來了乙個不小的問題,即響應客戶機的請求,伺服器要建立子程序來處理,而建立子程序是一種非常消耗資源的操作。 

udp伺服器每次從套接字上讀取乙個客戶端的資料報請求,處理接收到的udp資料報,然後將結果返回給客戶機。 

建立udp迴圈伺服器的演算法如下: 

socket(……);  //建立乙個資料報型別的套接字 

bind(……);     //邦定公認的短口號 

while(1)        //開始接收客戶端的連線 

因為udp是非面向連線的,沒有乙個客戶端可以獨佔伺服器。只要處理過程不是死迴圈,伺服器對於每乙個客戶機的請求總是能夠處理的。 

udp迴圈伺服器在資料報流量過大時由於處理任務繁重可能造成客戶技資料報丟失,但是因為udp協議本身不保證資料報可靠到達,所以udp協議是尤許丟失資料報的。 

鑑於以上兩點,一般的udp伺服器採用迴圈方式 

把併發的概念應用udp就得到了併發udp伺服器,和併發tcp伺服器模型一樣是建立子程序來處理的。 

建立udp併發伺服器的演算法如下: 

socket(……);  //建立乙個資料報型別的套接字 

bind(……);     //邦定公認的短口號 

while(1)        //開始接收客戶端的連線  }

除非伺服器在處理客戶端的請求所用的時間比較長以外,人們實際上很少用這種udp併發伺服器模型的。 

建立子程序會帶來系統資源的大量消耗,為了解決這個問題,採用多路復用i/o模型的併發伺服器。採用select函式建立多路復用i/o模型的併發伺服器的演算法如下: 

初始化(socket,bind,listen); 

while(1) 

否則說明是乙個已經連線過的描述符  } 

多路復用i/o可以解決資源限制問題,此模型實際上是將udp迴圈模型用在了tcp上面。這也會帶了一些問題,如由於伺服器依次處理客戶的請求,所以可能導致友的客戶會等待很久。 

linux網路伺服器

在本次中,學習了乙個簡單的基於tcp ip的伺服器 客戶端。在例子中,利用的是af inet域。在linux下,最常用就是af inet,af unix.af unix是linux檔案系統實現的本地要借字。後面的是可以用於包括英特網在內的tcp ip網路通訊的程式。下面來看乙個簡單的基於tcp ip...

Linux作業系統網路伺服器模型

linux作業系統網路伺服器模型主要有兩種 併發伺服器和迴圈伺服器。所謂併發伺服器就是在同乙個時刻可以處理來自多個客戶端的請求 迴圈伺服器是指伺服器在同一時刻只可以響應乙個客戶端的請求。而且對於tcp和udp套接字,這兩種伺服器的實現方式也有不同的特點。1 tcp迴圈伺服器 socket 建立乙個t...

關於網路伺服器

假如我有數千萬甚至是上億的使用者資料,我想把使用者自增id和使用者名稱username放到快取裡。我的需求是,當要查詢使用者的資訊時,我想先從快取裡根據使用者名稱username獲取到使用者的id,然後再通過id在資料庫裡查詢使用者的資訊。我想當乙個使用者表達到上億的數量級別時,用自增id來查詢肯定...