相較於多路io轉接伺服器實現方法一:select()函式,使用poll()
函式的優點有
檔案描述符的上限可以突破1024
select()
函式監聽集合與返回的滿足監聽條件的集合為乙個集合,而poll
函式將監聽集合與符合監聽條件的集合實現了分離
搜尋滿足條件的檔案描述符的範圍縮小了
但,poll
函式不能實現跨平台,只能在linux平台上使用,而select()
函式可以跨平台
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
#include
#include
#include
#include
#include
#include
#include
#include
#define port 8888
#define ip "127.0.0.1"
#define maxnum 6
intmain()
//監聽
listen
(sfd,
128)
;//初始化struct pollfd結構體陣列,將sfd放入陣列的0號位置
struct pollfd client[maxnum]
; client[0]
.fd = sfd;
client[0]
.events = pollin;
for(
int i =
1; i < maxnum; i++
)int maxi =0;
char buf[bufsiz]
;memset
(buf,0,
sizeof
(buf));
while(1
)}//這裡設定了最大的監聽數為maxnum,如果超過了這個值就不再監聽,退出
if(i == maxnum)
//將cfd加入監聽陣列client中後,設定其監聽屬性,即是要監聽他的讀事件還是寫事件異常事件
client[i]
.events = pollin;
//此處設定為監聽他的讀事件
//將陣列下標位置後移,其實就是現在一共實際要監聽的檔案描述符個數
if(i > maxi)
//此處if語句條件滿足要continue的原因是,假如ret中只有乙個sfd時,說明客戶端沒有向服務端傳送資料,所以跳出繼續監聽sfd的下乙個連線if(
--ret ==0)
}//**走到這裡說明監聽陣列client中,有客戶端在發資料了,接下來就是讀資料並寫回去
int sockfd;
int k;
for(k =
1; k <= maxnum; k++
)//k從1開始,就是跳過了第乙個sfd,其餘的客戶端傳送資料的檔案描述符
char rwbuf[bufsiz]
;memset
(buf,0,
sizeof
(buf));
if(client[k]
.revents & pollin)
else
if(len >0)
write
(sockfd,rwbuf,len);}
if(--ret ==0)
}}}close
(sfd)
;return0;
}
多路IO轉接伺服器實現方法一 select 函式
採用多程序與多執行緒的方法來實現併發伺服器時,監聽的工作由server應用程式自身通過accept函式不斷去監聽。當客戶端連線較多時,這種方法會大大降低程式執行效率,消耗cpu資源 cpu需要在不同進 執行緒中切換執行 多程序與多執行緒實現併發伺服器方法可以參考以下兩篇文章 因為以上兩種方法的侷限性...
I O多路轉接 epoll伺服器
在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...
多路IO轉接伺服器實現方法三 epoll 函式
epoll是linux下多路復用介面select poll的增強版本。它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率,因為它會復用檔案描述符集合來傳遞結果而不用每次等待時間之前都必須重新準備要被監聽的檔案描述符集合 獲取事件的時候,它無須遍歷整個被監聽的檔案描述符集,只要遍歷...