濮阳杆衣贸易有限公司

主頁 > 知識庫 > Linux操作系統(tǒng)網(wǎng)絡(luò)服務(wù)器模型分享

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

熱門標(biāo)簽:為什么地圖標(biāo)注后不顯示 大連遼寧電銷機(jī)器人 400電話辦理 誠薦翰諾科技 谷歌美發(fā)店地圖標(biāo)注入駐 地圖標(biāo)注路線軟件 好操作的電話機(jī)器人 了不起的修仙模擬器地圖標(biāo)注 地圖標(biāo)注機(jī)位 電話機(jī)器人客戶對話

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

復(fù)制代碼
代碼如下:

socket(……); //創(chuàng)建一個(gè)TCP套接字
bind(……); //邦定公認(rèn)的端口號
listen(……); //傾聽客戶端連接
while(1) //開始循環(huán)接收客戶端連接
{
accept(……);//接收當(dāng)前客戶端的連接
while(1)
{ //處理當(dāng)前客戶端的請求
read(……);
process(……);
write(……);
}
close(……); //關(guān)閉當(dāng)前客戶端的連接,準(zhǔn)備接收下一個(gè)客戶端連接
}

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

復(fù)制代碼
代碼如下:

socket(……); //創(chuàng)建一個(gè)TCP套接字
bind(……); //邦定公認(rèn)的端口號
listen(……);//傾聽客戶端連接
while(1) //開始循環(huán)接收客戶端的接收
{
accept(……);//接收一個(gè)客戶端的連接
if(fork(……)==0) //創(chuàng)建子進(jìn)程
{
while(1)
{ //子進(jìn)程處理某個(gè)客戶端的連接
read(……);
process(……);
write(……);
}
close(……); //關(guān)閉子進(jìn)程處理的客戶端連接
exit(……) ;//終止該子進(jìn)程
}
close(……); //父進(jìn)程關(guān)閉連接套接字描述符,準(zhǔn)備接收下一個(gè)客戶端連接
}

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

復(fù)制代碼
代碼如下:

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

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

復(fù)制代碼
代碼如下:

while(1)
{
設(shè)置監(jiān)聽讀寫文件描述符(FD_*);
調(diào)用select;
如果是傾聽套接字就緒,說明一個(gè)新的連接請求建立
{
建立連接(accept);
加入到監(jiān)聽文件描述符中去;
}
否則說明是一個(gè)已經(jīng)連接過的描述符
{
進(jìn)行操作(read或者write);
}

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

標(biāo)簽:東營 阜陽 云浮 慶陽 新鄉(xiāng) 法律服務(wù) 沈陽 邵陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux操作系統(tǒng)網(wǎng)絡(luò)服務(wù)器模型分享》,本文關(guān)鍵詞  Linux,操作系統(tǒng),網(wǎng)絡(luò),服務(wù)器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux操作系統(tǒng)網(wǎng)絡(luò)服務(wù)器模型分享》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux操作系統(tǒng)網(wǎng)絡(luò)服務(wù)器模型分享的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    甘谷县| 湖北省| 永善县| 阿鲁科尔沁旗| 县级市| 吉隆县| 清远市| 永康市| 汾阳市| 海晏县| 鹿邑县| 交城县| 蓬安县| 张家口市| 仁布县| 珲春市| 衡南县| 申扎县| 襄垣县| 泗阳县| 滕州市| 资溪县| 张家界市| 买车| 邢台县| 邯郸县| 文化| 华亭县| 柳州市| 阳信县| 固镇县| 新巴尔虎右旗| 东阿县| 若羌县| 广东省| 定远县| 广西| 襄城县| 阿图什市| 青阳县| 清镇市|