多路io轉接伺服器也叫做多工io伺服器。該類伺服器實現的主旨思想是,不再由應用程式自己監視客戶端連線,取而代之由核心替應用程式監視檔案。
主要使用的方法有三種:
select能監聽的檔案描述符個數受限於fd_setsize,一般為1024,單純改變程序開啟的檔案描述符個數並不能改變select監聽檔案個數
#include
/* according to earlier standards */
#include
#include
#include
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds: 監控的檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態
readfds: 監控有讀資料到達檔案描述符集合,傳入傳出引數
writefds: 監控寫資料到達檔案描述符集合,傳入傳出引數
exceptfds: 監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數
timeout: 定時阻塞監控時間,3種情況
1.null,永遠等下去
2.設定timeval,等待固定時間
3.設定timeval裡時間均為0,檢查描述字後立即返回,輪詢
struct timeval ;
void fd_clr(int fd, fd_set *set); //把檔案描述符集合裡fd清0
int fd_isset(int fd, fd_set *set); //測試檔案描述符集合裡fd是否置1
void fd_set(int fd, fd_set *set); //把檔案描述符集合裡fd位置1
void fd_zero(fd_set *set); //把檔案描述符集合裡所有位清0
fd_set(connfd, &allset); /* 向監控檔案描述符集合allset新增新的檔案描述符connfd */
if (connfd > maxfd)
maxfd = connfd; /* select第乙個引數需要 */
if (i > maxi)
maxi = i; /* 保證maxi存的總是client最後乙個元素下標 */
if (--nready == 0)
continue;
} for (i = 0; i <= maxi; i++) else
if (n > 0)
if (--nready == 0)
break; /* 跳出for, 但還在while中 */}}
I O多路轉接 epoll伺服器
在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...
I O多路轉接之poll伺服器
函式說明 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 ...
6 12多路IO轉接伺服器之select
title date comments categories br 多路i o轉接伺服器之select 2020 3 18 true linux linux 伺服器 6.12 多路i o轉接伺服器也叫多工io伺服器或者i o多路復用技術。該類伺服器實現的主旨思想是,不再由應用程式自己監聽客戶端的連線...