select多路io轉接:
原理: 借助核心,select來監聽,客戶端連線、資料通訊事件
void fd_clr(int fd, fd_set *set); 將乙個檔案描述符從監聽集合中 移除
fd_clr(4,&rset)
int fd_isset(int fd, fd_set *set); 判斷乙個檔案描述符是否在監聽集合中
fd_isset(4,&rset)
void fd_set(int fd, fd_set *set); 將待監聽的檔案描述符新增到 監聽集合中
fd_set(4,&rset)
void fd_zero(fd_set *set); 清空乙個檔案描述符集合
fd_zero(4,&rset)
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds: 監聽的所有檔案描述符中,最大的檔案描述符 +1
readfds: 讀 檔案描述符監聽集合 傳入傳出 引數
writefds: 寫 檔案描述符監聽集合 傳入傳出 引數
exceptfds: 異常 檔案描述符監聽集合 傳入傳出 引數
timeout: 》0 : 設定監聽超時時長
null 阻塞監聽
0 非阻塞 輪訓監聽
返回值:
》0 所有監聽集合(3個)中, 滿足對應事件的總數
0 沒有滿足條件 的檔案描述符
-1 : errno
思路分析:
lfd = socket(); 建立套接字
bind(); 繫結位址結構
listen() 設定監聽上限
fd_set rset,allset; 建立監聽集合
fd_zero(&allset) 將監聽集合清空
fd_set(lfd,&allset) 將lfd新增到讀集合中
while(1)
}select優缺點:
缺點: 監聽上限受檔案描述符限制 最大 1024
檢測滿足條件的 fd, 自己新增業務邏輯 提高可編碼難度
返回滿足監聽條件的檔案描述符個數 並沒有直接告訴哪些檔案描述符就緒了 需要從頭遍歷傳出的事件集合
每次呼叫
select,
都需要手動設定
fd集合
, 從介面使用角度來說也非常不便.
每次呼叫
select
,都需要把
fd集合從使用者態拷貝到核心態,這個開銷在
fd很多時會很大
同時每次呼叫
select
都需要在核心遍歷傳遞進來的所有
fd,這個開銷在
fd很多時也很大
優點:跨平台。
#include#include#include#include#include#include#include#define serv_port 6666
int main()
if(fd_isset(listenfd,&rset))
for(i=0;i<=maxi;++i)else if(n>0){
for(j=0;j
I O多路轉接(select
一.基本概念 二.函式原型 includeint select int nfds,fd set readfds,fd set writefds,fd set exceptions,struct timeval timeout fd set 介面 void fd clr int fd,fd set s...
select多路IO轉接
void fd zero fd set set 清空乙個檔案描述符集合。fd set rset fd zero rset void fd set int fd,fd set set 將待監聽的檔案描述符,新增到監聽集合中 fd set 3,rset fd set 5,rset fd set 6,rs...
I O多路轉接之select
什麼是i o多路轉接技術 先構建一張有關描述符的列表,然後呼叫乙個函式,直到這些描述符中的乙個已準備好進行i o時,該函式才返回,在返回時,他告訴程序哪些描述符已準備好可以進行i o。上述呼叫的函式,有select,poll,pselect及poll的增強版epoll等,本文主要介紹select。函...