天天看點

了解select模型的六大注意點

Select模型出現的目的::模型的出現是為了解決“一個用戶端一線程”的問題,為了WINDOWS的線程切換不要太頻繁。

select函數

int select(

int maxfdp,   //忽略

fd_set *readfds,//檢查可讀性

fd_set *writefds,      //檢查可寫性

fd_set *errorfds,      //檢查錯誤

struct timeval *timeout   //指定函數等待的最長時間

);

1、了解struct fd_set(一個套接字集合)

struct fd_set可以了解為一個集合,這個集合中存放的是檔案描述符(filedescriptor),即檔案句柄,這可以是我們所說的普通意義的檔案,當然Unix下任何裝置、管道、FIFO等都是檔案形式,全部包括在内,是以毫無疑問一個socket就是一個檔案,socket句柄就是一個檔案描述符。

2、使用struct fd_set

FD_ZERO(fd_set * set); //清空集合

FD_SET(s,fd_set * set); //添加套接字集合

FD_CLR(s ,fd_set* set); //從set移除套接字s

FD_ISSET(s ,fd_set* set);//檢查集合中s是否set的成員

3、struct timeval

struct timeval {   

time_t tv_sec; /* 秒*/   

suseconds_t tv_usec; /* 微秒*/  };

4、參數含義

fd_set*readfds我們是要監視這些檔案描述符的讀變化的,即我們關心是否可以從這些檔案中讀取資料了,如果這個集合中有一個檔案可讀,select就會傳回一個大于0的值,表示有檔案可讀,如果沒有可讀的檔案,則根據timeout參數再判斷是否逾時,若超出timeout的時間,select傳回0,若發生錯誤傳回負值。可以傳入NULL值,表示不關心任何檔案的讀變化。   

fd_set*writefds我們是要監視這些檔案描述符的寫變化的,即我們關心是否可以向這些檔案中寫入資料了,如果這個集合中有一個檔案可寫,select就會傳回一個大于0的值,表示有檔案可寫,如果沒有可寫的檔案,則根據timeout參數再判斷是否逾時,若超出timeout的時間,select傳回0,若發生錯誤傳回負值。可以傳入NULL值,表示不關心任何檔案的寫變化。   

fd_set *errorfds同上面兩個參數的意圖,用來監視檔案錯誤異常。

5、逾時的設定

struct timeval *timeout是select的逾時時間,這個參數至關重要,它可以使select處于三種狀态

①、若将NULL以形參傳入,即不傳入時間結構,就是将select置于阻塞狀态,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;

②、若将時間值設為0秒0毫秒,就變成一個純粹的非阻塞函數,不管檔案描述符是否有變化,都立刻傳回繼續執行,檔案無變化傳回0,有變化傳回一個正值;

③、timeout的值大于0,這就是等待的逾時時間,即select在timeout時間内阻塞,逾時時間之内有事件到來就傳回了,否則在逾時後不管怎樣一定傳回,傳回值同上述。

6、傳回值:   

繼續閱讀