博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
select 函数使用指难
阅读量:2427 次
发布时间:2019-05-10

本文共 2225 字,大约阅读时间需要 7 分钟。

int select(

  int ,
  fd_set*
,
  fd_set*
,
  fd_set*
,
  const struct timeval*
);

第一个参数 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还可以用来计时,据说准确一点.

我描述能力比较差,只能到这个程度了..以后要慢慢努力..

 

转载地址:http://oddmb.baihongyu.com/

你可能感兴趣的文章
hash原理总结
查看>>
mongodb的优缺点
查看>>
如何在cmd下,查找指定一个TXT文件的内容,把这个文本里包含关键字的所有行复制到一个新的文本中
查看>>
线程池和队列学习,队列在线程池中的使用,什么是队列阻塞,什么是有界队列
查看>>
复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离
查看>>
svn小乌龟怎么断开链接,怎么查看电脑中的隐藏文件,svn复制包或修改包名应注意什么
查看>>
DDR内存基础知识
查看>>
uboot结构之BL0、BL1、BL2、BL3区别于关系
查看>>
Linux模块传参
查看>>
文件系统
查看>>
Linux驱动之总线
查看>>
App 穷途末路?
查看>>
IoT 时代,你要么被颠覆,要么成为颠覆者!
查看>>
漫画:什么是囚徒困境?
查看>>
如何用 160 行代码,实现动态炫酷的可视化图表?
查看>>
山东到底有没有互联网?
查看>>
10 步教你接手同事的代码!
查看>>
买不到口罩怎么办?Python 爬虫帮你时刻盯着自动下单!| 原力计划
查看>>
一图读懂浏览器演变史 | 每日趣闻
查看>>
苹果安全漏洞曝光:可能有 5 亿部 iPhone 易受攻击
查看>>