国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux操作系統(tǒng)網(wǎng)絡服務器模型分享

2020-06-13 12:30:42
字體:
來源:轉載
供稿:網(wǎng)友
Linux操作系統(tǒng)網(wǎng)絡服務器模型主要有兩種:并發(fā)服務器和循環(huán)服務器
 
 

所謂并發(fā)服務器就是在同一個時刻可以處理來自多個客戶端的請求;循環(huán)服務器是指服務器在同一時刻只可以響應一個客戶端的請求。而且對于TCP和UDP套接字,這兩種服務器的實現(xiàn)方式也有不同的特點。 
1、TCP循環(huán)服務器: 
  首先TCP服務器接受一個客戶端的連接請求,處理連接請求,在完成這個客戶端的所有請求后斷開連接,然后再接受下一個客戶端的請求。創(chuàng)建TCP循環(huán)服務器的算法如下: 
 

復制代碼
代碼如下:

socket(……); //創(chuàng)建一個TCP套接字 
bind(……); //邦定公認的端口號 
listen(……); //傾聽客戶端連接 
while(1) //開始循環(huán)接收客戶端連接 

accept(……);//接收當前客戶端的連接 
while(1) 
{ //處理當前客戶端的請求 
read(……); 
process(……); 
write(……); 

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

TCP循環(huán)服務器一次只處理一個客戶端的請求,如果有一個客戶端占用服務器不放時,其它的客戶機連接請求都得不到及時的響應。因此,TCP服務器一般很少用循環(huán)服務器模型的。 
2、TCP并發(fā)服務器: 
  并發(fā)服務器的思想是每一個客戶端的請求并不由服務器的主進程直接處理,而是服務器主進程創(chuàng)建一個子進程來處理。創(chuàng)建TCP并發(fā)服務器的算法如下: 

復制代碼
代碼如下:

socket(……); //創(chuàng)建一個TCP套接字 
bind(……); //邦定公認的端口號 
listen(……);//傾聽客戶端連接 
while(1) //開始循環(huán)接收客戶端的接收 

accept(……);//接收一個客戶端的連接 
if(fork(……)==0) //創(chuàng)建子進程 

while(1) 
{ //子進程處理某個客戶端的連接 
read(……); 
process(……); 
write(……); 

close(……); //關閉子進程處理的客戶端連接 
exit(……) ;//終止該子進程 

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

TCP并發(fā)服務器可以解決TCP循環(huán)服務器客戶端獨占服務器的情況。但同時也帶來了一個不小的問題,即響應客戶機的請求,服務器要創(chuàng)建子進程來處理,而創(chuàng)建子進程是一種非常消耗資源的操作。 
3、UDP循環(huán)服務器: 
  UDP服務器每次從套接字上讀取一個客戶端的數(shù)據(jù)報請求,處理接收到的UDP數(shù)據(jù)報,然后將結果返回給客戶機。創(chuàng)建UDP循環(huán)服務器的算法如下: 
1 socket(……); //創(chuàng)建一個數(shù)據(jù)報類型的套接字 2 bind(……); //邦定公認的短口號 3 while(1) //開始接收客戶端的連接 4 { //接收和處理客戶端的UDP數(shù)據(jù)報 5 recvfrom(……); 6 process(……); 7 sendto(……);//準備接收下一個客戶機的數(shù)據(jù)報 8 } 
消除行號 
因為UDP是非面向連接的,沒有一個客戶端可以獨占服務器。只要處理過程不是死循環(huán),服務器對于每一個客戶機的請求總是能夠處理的。 
  UDP循環(huán)服務器在數(shù)據(jù)報流量過大時由于處理任務繁重可能造成客戶技數(shù)據(jù)報丟失,但是因為UDP協(xié)議本身不保證數(shù)據(jù)報可靠到達,所以UDP協(xié)議是允許丟失數(shù)據(jù)報的。 
  鑒于以上兩點,一般的UDP服務器采用循環(huán)方式4、UDP并發(fā)服務器把并發(fā)的概念應用UDP就得到了并發(fā)UDP服務器,和并發(fā)TCP服務器模型一樣是創(chuàng)建子進程來處理的。 
  創(chuàng)建UDP并發(fā)服務器的算法如下: 

復制代碼
代碼如下:

socket(……); //創(chuàng)建一個數(shù)據(jù)報類型的套接字 
bind(……); //邦定公認的短口號 
while(1) //開始接收客戶端的連接 
{ //接收和處理客戶端的UDP數(shù)據(jù)報 
recvfrom(……); 
if(fork(……)==0) //創(chuàng)建子進程 

rocess(……); 
sendto(……); 


除非服務器在處理客戶端的請求所用的時間比較長以外,人們實際上很少用這種UDP并發(fā)服務器模型的。 
4、多路復用I/O并發(fā)服務器: 
  創(chuàng)建子進程會帶來系統(tǒng)資源的大量消耗,為了解決這個問題,采用多路復用I/O模型的并發(fā)服務器。采用select函數(shù)創(chuàng)建多路復用I/O模型的并發(fā)服務器的算法如下: 
初始化(socket,bind,listen); 

復制代碼
代碼如下:

while(1) 

設置監(jiān)聽讀寫文件描述符(FD_*); 
調用select; 
如果是傾聽套接字就緒,說明一個新的連接請求建立 

建立連接(accept); 
加入到監(jiān)聽文件描述符中去; 

否則說明是一個已經(jīng)連接過的描述符 

進行操作(read或者write); 

多路復用I/O可以解決資源限制問題,此模型實際上是將UDP循環(huán)模型用在了TCP上面。這也會帶了一些問題,如由于服務器依次處理客戶的請求,所以可能導致友的客戶會等待很久。
 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 郁南县| 甘谷县| 收藏| 喀喇沁旗| 南通市| 从化市| 泊头市| 平泉县| 德昌县| 额敏县| 东台市| 交口县| 静宁县| 合江县| 尤溪县| 浮梁县| 徐州市| 吉林省| 嘉祥县| 化德县| 乌鲁木齐县| 泉州市| 万源市| 博湖县| 金塔县| 基隆市| 兴城市| 石门县| 保山市| 兰考县| 冷水江市| 昌黎县| 成安县| 西乡县| 罗甸县| 蓬莱市| 怀宁县| 广水市| 丘北县| 余庆县| 阿合奇县|