分類: 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...