select 函數使用指難

原型

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

第一個參數 nfds

在linux下的描述:指定測試的描述符最大值,在0到nfds都會被測試,

到了windows下: Ignored. The nfds parameter is included only for compatibility with Berkeley sockets. 忽略了。

持續增加中,晚上回去寫

code is anything

//2005.12.14追加

我說話有點不負責任..現在補上,

那就完全一點 從accept開始.

首先:
SOCKET sock;
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)    // select的第一個參數是可以忽略的(這樣寫是爲了保持和linux下一致) 第二個參數放入需要測試的讀描述符集(也就是說如果這裏面有一個描述符可以讀取了,select就返回) 第三個放入需要測試的寫描述符集,第四個放入"可執行描述符集"(??我也不知道) 第五個參數是超時時間(如果過了這個超時時間依然沒有描述符準備好,select也返回.(如果爲NULL,那就一直等到一個描述符集變成準備好的狀態)
{ //這個大括號接上面的,返回0那麼就超過了timeout預定的時間

//處理....

}

if(FD_ISSET(sock,&rfd))
{      //有一個描述符準備好了

socka=accept(sock,0,0);       //好了 接受它吧

//你還要判斷一下socka是不是有效的socket纔行....

-------------------------------------------------------------------------------------------------------------------------------

一般的情況下

假設你要判斷兩個socket 是否可讀可寫 那就這樣:

假設 socka 和sockb 是兩個socket 他們已經被連接上,並且能夠收發數據

fd_set rfd,wfd;//一個用來測試讀 一個用來測試寫

FD_ZERO(&rfd);

FD_ZERO(&wfd);

FD_SET(socka,&rfd);//把socka放入讀描述符集

FD_SET(sockb,&rfd);//把sockb放入讀描述符集

FD_SET(socka,&wfd);把socka放入寫描述符集

FD_SET(sockb,&wfd);把sockb放入寫描述符集

if(SOCKET_ERROR!=select(0,&rfd,&wfd,0,0))      //測試這兩個描述符集,永不超時 其中rfd只用來測試讀 wfd只用來測試寫

{      //沒有錯誤

if(FD_ISSET(socka,&rfd))    //socka可讀

{...}

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

{...}

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

{...}

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

{...}

}

.............................................................................................

大致上來說,select就是這樣子....記得這個select還可以用來計時,據說準確一點.

我描述能力比較差,只能到這個程度了..以後要慢慢努力..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章