原型
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還可以用來計時,據說準確一點.
我描述能力比較差,只能到這個程度了..以後要慢慢努力..