select模型
優點 可跨平台 實現多路復用 避免了頻繁建立多程序/多執行緒處理連線產生的開銷,提高了連線處理效率
缺點 最多監聽1024個檔案描述符 事件處理時需要依次遍歷,帶來不必要的開銷
select函式原型
//nfds 最大描述符加1
//readfds 輸入輸出引數 返回讀事件檔案描述符集合
//writefds輸入輸出引數 返回寫事件檔案描述符集合
//exceptfds輸入輸出引數 返回異常事件檔案描述符集合
//timeout 0 非阻塞 立即返回 -1 無限超時,直到指定事件發生
// >0 指定時間內監聽到即返回 未監聽到事件且超時立即返回
//返回發生指定事件的總個數
intselect
(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout)
;
輔助函式
void
fd_clr
(int fd, fd_set *set)
;//從集合中清除指定的檔案描述符fd
intfd_isset
(int fd, fd_set *set)
;//判斷fd在集合中的狀態
void
fd_set
(int fd, fd_set *set)
;//新增fd到集合中
void
fd_zero
(fd_set *set)
;//重置集合set為0
示例
#include
"wrap.h"
#include
"stdio.h"
#include
"stdlib.h"
#include
"netinet/ip.h"
#include
"sys/select.h"
#include
"unistd.h"
#include
"strings.h"
#include
"ctype.h"
#include
"arpa/inet.h"
#define port 8888
void
server_select()
else
if(lnum ==1)
}}for(i=lfd+
1;i<=maxfd;
++i)
//遍歷處理讀集合中的描述符請求
write
(stdout_fileno,buf,n)
;for
(int j=
0;j++j)
write
(i,buf,n);}
}}}int
main
(int args,
char
*argc)
網路程式設計之 多路IO轉接 select模型改進
select模型中在處理監聽事件時需要對檔案描述符依次遍歷,此處可以稍作改進,避免不必要的遍歷。改進思路 定義乙個fd setsize大小的陣列,用於儲存有效連線 定義乙個下標變數用於記錄儲存連線陣列中的有效連線最大下標,供遍歷作為上限值使用 int maxc 1 int client fd set...
Linux網路程式設計之多路I O復用
1.select函式 include int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout void fd clr int fd,fd set set int fd iss...
網路程式設計 多路I O轉接伺服器之select
思路 利用select 函式監聽資訊,accept 函式非阻塞的建立連線。相關api include according to earlier standards include include include intselect int nfds,fd set readfds,fd set wri...