socket 中 select 使用指南

2009-05-13 06:19:20来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


原型
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,那就一直等到一个描述符集变成准备好的状态)

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:socket编程原理

下一篇:改变ports的安装源