socket select函式的詳細講解

2021-07-05 09:23:59 字數 2897 閱讀 1388

原型

int select(

intnfds

,

fd_set*readfds

,

fd_set*writefds

,

fd_set*exceptfds

,

const struct timeval*timeout

);

nfds:本引數忽略,僅起到相容作用。

readfds:(可選)指標,指向一組等待可讀性檢查的套介面。

writefds:(可選)指標,指向一組等待可寫性檢查的套介面。

exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。

timeout:select()最多等待時間,對阻塞操作則為null。

範例 :

sock= socket(af_inet,sock_stream,0);

struct sockaddr_in addr;     //告訴sock 應該再什麼地方licence

memset(&addr,0,sizeof(addr));

addr.sin_family=af_inet;

addr.sin_port=htons(11111);  

//埠啦

addr.sin_addr.s_addr=htonl(inaddr_any);        //在本機的所有ip上開始監聽

bind (sock,(sockaddr *)&addr,sizeof(addr));//bind....

listen(sock,5);                   //最大5個佇列

socket socka;                    //這個用來接受乙個連線

fd_set rfd;                     // 描述符集 這個將用來測試有沒有乙個可用的連線

struct timeval timeout;

fd_zero(&rfd);                     //總是這樣先清空乙個描述符集

timeout.tv_sec=60;                //等下select用到這個

timeout.tv_usec=0;

u_long ul=1;

ioctlsocket(sock,fionbio,&ul);    //用非阻塞的連線

//現在開始用select

fd_set(sock,&rfd);   //把sock放入要測試的描述符集 就是說把sock放入了rfd裡面 這樣下一步呼叫select對rfd進行測試的時候就會測試sock了(因為我們將sock放入的rdf) 乙個描述符集可以包含多個被測試的描述符, 

if(select(sock+1,&rfd,0,0, &timeout)==0) 

if(fd_isset(sock,&rfd))

if(fd_isset(sockb,&rfd)   //sockb可讀

if(fd_isset(socka,&wfd) //socka 可寫

if(fd_isset(sockb,&wfd) //sockb可寫

}二、linux c中

select(i/o多工機制)

表頭檔案

#i nclude

#i nclude

#i nclude

定義函式

int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);

函式說明

select()用來等待檔案描述詞狀態的改變。引數n代表最大的檔案描述詞加1,引數readfds、writefds 和exceptfds 稱為描述片語,是用來回傳該描述詞的讀,寫或例外的狀況。底下的巨集提供了處理這三種描述片語的方式:

fd_clr(inr fd,fd_set* set);用來清除描述片語set中相關fd 的位

fd_isset(int fd,fd_set *set);用來測試描述片語set中相關fd 的位是否為真

fd_set(int fd,fd_set*set);用來設定描述片語set中相關fd的位

fd_zero(fd_set *set); 用來清除描述片語set的全部位

引數timeout為結構timeval,用來設定select()的等待時間,其結構定義如下

struct timeval

;返回值

如果引數timeout設為null則表示select()沒有timeout。

錯誤**

執行成功則返回檔案描述詞狀態已改變的個數,如果返回0代表在描述詞狀態改變前已超過timeout時間,當有錯誤發生時則返回-1,錯誤原因存於errno,此時引數readfds,writefds,exceptfds和timeout的值變成不可**。

ebadf 檔案描述詞為無效的或該檔案已關閉

eintr 此呼叫被訊號所中斷

einval 引數n 為負值。

enomem 核心記憶體不足

範例常見的程式片段:fs_set readset;

fd_zero(&readset);

fd_set(fd,&readset);

select(fd+1,&readset,null,null,null);

if(fd_isset(fd,readset)

下面是linux環境下select的乙個簡單用法

#i nclude

#i nclude

#i nclude

#i nclude

#i nclude

#i nclude

int main ()}}

socket select函式的詳細講解

原型 int select intnfds fd set readfds fd set writefds fd set exceptfds const struct timeval timeout nfds 本引數忽略,僅起到相容作用。readfds 可選 指標,指向一組等待可讀性檢查的套介面。wr...

socket select 引數詳解

socket select 引數詳解 2010 06 09 17 52 select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他 們只是習慣寫諸如 connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式bloc...

函式的用法 Excel函式TREND函式的用法

trend函式是乙個線性趨勢的 函式,在已知y值 x值的條件下,x對應的y值 trend共有4個引數,三個必選引數,乙個可選引數 同樣的一組資料第四引數不同,結果也是有區別的 灰色曲線是由第四引數為false時得到的結果生成的曲線。通過斜率與截距函式我們計算出這兩條曲線的斜率與截距,可以看出,第四引...