天天看點

Linux IO模型漫談(5)- IO複用模型之selectselect函數fd_set集合操作伺服器端代碼:用戶端1 代碼:用戶端2代碼:調用步驟:

首先需要了解的是select函數:

#include<sys/select.h>

#include<sys/time.h>

int select (int maxfd , fd_set *readset ,fd_set *writeset, fd_set *exceptionset , const struct timeval * timeout);

傳回:就緒描述字的正數目,0——逾時,-1——出錯

參數解釋:

maxfd: 最大的檔案描述符(其值應該為最大的檔案描述符字 + 1)

readset: 核心讀操作的描述符字集合

writeset:核心寫操作的描述符字集合

exceptionset:核心異常操作的描述符字集合

timeout:等待描述符就緒需要多少時間。null代表永遠等下去,一個固定值代表等待固定時間,0代表根本不等待,檢查描述字之後立即傳回。

注意:readset,writeset,exceptionset都是值-結果參數,意思就是他們傳進入指針進去,函數根據指針可以修改對應的fd_set

fd_set和名字一樣,是一個描述符的集合。有下面幾個操作:

void fd_zero(fd_set *fdset); /* 将所有fd清零 */

void fd_set(int fd, fd_set *fdset); /* 增加一個fd */

void fd_clr(int fd, fd_set *fdset); /* 删除一個fd */

int fd_isset(int fd, fd_set *fdset); /* 判斷一個fd是否有設定 */

我們現在要做一個select使用的server,server監聽兩個端口(7778和7779)的socket。再使用兩個cli,一個client連接配接到7778端口,另一個client連接配接到7779端口。

1 啟動伺服器端

2 啟動用戶端1

3 啟動用戶端2

4 伺服器端表

用戶端啟動:

Linux IO模型漫談(5)- IO複用模型之selectselect函數fd_set集合操作伺服器端代碼:用戶端1 代碼:用戶端2代碼:調用步驟:

服務端表現:

Linux IO模型漫談(5)- IO複用模型之selectselect函數fd_set集合操作伺服器端代碼:用戶端1 代碼:用戶端2代碼:調用步驟:

這裡就是使用select函數對多個socket進行讀監聽

繼續閱讀