首先需要了解的是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 伺服器端表
用戶端啟動:

服務端表現:
這裡就是使用select函數對多個socket進行讀監聽