socket中的select函式使用

2021-06-08 02:43:20 字數 1847 閱讀 3269

分類: windows sdk series

程式語言基礎

2012-07-07 17:14

126人閱讀收藏 

舉報socket select()函式用於定時檢查以建立的socket控制代碼的狀態,

以確定設定的socket控制代碼當前是否可寫或有資料可讀。

select函式提供了一種方法,使得程式在操作socket時(如recv操作),

無需因阻塞而等待直至超時。特別是在乙個執行緒中操作多個socket時,

對多個socket逐一操作直至超時將浪費大量時間。

select機制則是同時對多個socket控制代碼進行監控,一旦存在可操作的socket,

函式及返回並通知程式。

select函式宣告:

int select(

int nfds, 

fd_set* readfds, 

fd_set* writefds, 

fd_set* exceptfds, 

const struct timeval* timeout

);fd_set是乙個結構體,包含了乙個socket陣列及乙個整數用於表示陣列中有效的

socket控制代碼數。

readfds引數,用於指示select函式:當其中包含的socket控制代碼可讀時,函式返回。

writefds和exceptfds則分別表示其中包含的socket控制代碼可寫或異常時,函式返回。

timeout是乙個時間值結構,表示當前select函式執行時的超時時間,

如果所有socket暫時都沒有可操作事件發生,則函式將一直等待直至超時,

如果timeout設定為null時,select()函式則一直等到包含的socket存在操作事件

時才返回。

select函式的返回值是乙個整數。

如果執行異常,比如,指定的socket控制代碼是非法的等等,

函式將返回socket_error,也就是-1.

如果select函式執行超時,即在指定的timeout時間內,沒有可操作的socket出現,

那麼返回0.

其餘情況函式將返回乙個大於0的整數,用於指明可操作的socket總數。

由於select只返回乙個表示總數的整數,那麼如果一次select多個socket控制代碼,

或者函式執行時即指定了readfds,也指定了writefds,函式本身將無法告訴程式

到底哪個socket控制代碼可讀或可寫。

所以在使用select時,盡量只指定檢查乙個操作狀態。

不過對於同步阻塞的socket操作,writefds引數用到的機會可能會比較少。

示例:[cpp]view plain

copy

socket hsock = ...  

.....  

fd_set rds, wrs, exs;  

fd_zero(&rds);     // 初始化

fd_zero(&wrs);  

fd_zero(&exs);  

fd_set(hsock, &rds);    //設定socket控制代碼到select的fd引數中

fd_set(hsock, &wrs);  

fd_set(hsock, &exs);  

timeval timeout;  

timeout.tv_sec  = 5000;  

timeout.tv_usec = 0;  

while

(int

ret = select(1, null, &wrs, null, &timeout))  

else

if( ret == socket_error)  else

}  

socket程式設計中select的使用

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

socket程式設計中select的使用

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

Socket程式設計中select 的妙用

原文由 cpu 所發表 用過 winsock api 們知道 winsock 程式設計中有一很方便的地方便是其 息驅動機制,不管是底層 api 的 wsaasyncselect 還是 mfc 的非同步socket類 casyncsocket,都提供了諸如 fd accept fd read fd c...