将套接口socket添加到fd_set 队列里面 后者可以通过传递给select函数来监听这一组套接口的状态,例如套接口上是否有数据传来等状态

select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。

typedef struct fd_set {u_int fd_count;               /* how many are SET? */SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
} fd_set;

很明了,一个计数的fd_count,另一个就是SOCKET数组。其中,FD_SETSIZE是64.(具体可以去查看vs的代码)

win下面FD_SET就是检查SOCKET在数组中是否存在,如果不存在,那么就插入到数组最后。而FD_CLR(fd, set)是把fd后面的东西往前拷贝,然后计数减1.FD_ZERO仅仅是把计数置为0(这个要注意!!)!FD_ISSET就看不到实现了。

简单函数使用 

fd_set set;
FD_ZERO(&set); /*将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*将fd加入set集合*/
FD_CLR(fd, &set); /*将fd从set集合中清除*/
FD_ISSET(fd, &set); /*测试fd是否在set集合中*/
示例:
#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>
int main(void)
{fd_set fdset;FD_ZERO (&fdset);/*清空集合中所有的元素*/FD_SET(STDOUT_FILENO,&fdset);/*设置stdout,使集合中包含stdout*/if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)/*测试stdout是否包含在集合中*/printf("stdout has been set\n");elseprintf("stdout has not been set\n");FD_CLR(STDOUT_FILENO,&fdset);/*从位向量中清除stdout*、if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)printf("stdout has been set\n");/*再次测试*/elseprintf("stdout has not been set\n");return 0;
}

实例

uint32 SocketWait(TSocket *s,bool rd,bool wr,uint32 timems)
{fd_set rfds,wfds;
#ifdef _WIN32TIMEVAL tv;
#elsestruct timeval tv;
#endif   /* _WIN32 */ FD_ZERO(&rfds);FD_ZERO(&wfds); if (rd)     //TRUEFD_SET(*s,&rfds);   //添加要测试的描述字 if (wr)     //FALSEFD_SET(*s,&wfds); tv.tv_sec=timems/1000;     //secondtv.tv_usec=timems%1000;     //ms for (;;) //如果errno==EINTR,反复测试缓冲区的可读性switch(select((*s)+1,&rfds,&wfds,NULL,(timems==TIME_INFINITE?NULL:&tv)))  //测试在规定的时间内套接口接收缓冲区中是否有数据可读{                                              //0--超时,-1--出错case 0:     /* time out */return 0; case (-1):    /* socket error */if (SocketError()==EINTR)break;              return 0; //有错但不是EINTR default:if (FD_ISSET(*s,&rfds)) //如果s是fds中的一员返回非0,否则返回0return 1;if (FD_ISSET(*s,&wfds))return 2;return 0;};
}

C/C++ select fd_set解释相关推荐

  1. linux—select具体解释

    linux-select具体解释 select系统调用时用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变. 关于文件句柄,事 ...

  2. Linux下I/O多路转接之select --fd_set

    fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...

  3. jqurey操作select 语法解释

    jQuery获取Select选择的Text和Value: 语法解释: 1. $("#selectId").change(function(){ ... }); //为Select添 ...

  4. select fd_set

    2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字. 文件描述符fd的值 不能超过1024,而不是数量不能超过1024. 在开发打开句柄多的程序时 ...

  5. 彻底解释Linux select的1024限制(select真的受1024限制吗?不!)

    很多很多年前,我被面试 为什么select调用最多只支持1024个文件描述符? 我没有答出来,我甚至不知道select到底是干什么的. 又过了很多年,我用这个问题面试了别人- 在当时,我心里已经有了会 ...

  6. C++网络编程快速入门(二):Linux下使用select演示简单服务端程序

    目录 select参数解释 select使用规范 select使用缺点 基本流程 实例代码 通信效果演示 往期文章 select参数解释 extern int select (int __nfds, ...

  7. select和epoll的区别详解

    1. 名词解释 1.1 文件描述符fd 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念. 文件描述符在形式上是一个非负整数.实际上,它是 ...

  8. select poll epoll 高效IO 多路转接

    目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...

  9. MyBatis-03 MyBatis XML方式之select元素

    概述 select用法 根据用户id查询用户信息 1.UserMapper接口中添加接口方法 2. UserMapper.xml中配置resultMap和select元素 查询全部的SysUser 添 ...

最新文章

  1. windows操作系统的引导过程描述
  2. 这里有一个3天的秘境邀请!
  3. ios设置tabbar背景颜色_WooCommerce微信小程序2.9.3版本发布 后台设置主题色 底栏装修定制...
  4. linux tr命令详解
  5. 给大家几个不花钱看书的办法【人人都是产品经理】
  6. IOS开发基础之手势解锁项目案例
  7. JQuery对象与DOM对象的区别与转换
  8. django本地安装mysql_Ununtu 15.04 安装MySql(Django连接Mysql)
  9. easyui前端实现多选框_EasyUI实现下拉框多选功能
  10. Chrome浏览器 开发者工具中的 Performance
  11. python 和scikit安装
  12. YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行
  13. 计算机无法屏幕亮度,今天详解win10电脑屏幕亮度无法调节的具体解决手法
  14. 内网穿透工具-venom
  15. 关于PSINS运动轨迹仿真模块的理解和思考
  16. 探索C语言之字符串分割函数:strtok和strsep的区别
  17. 程序猿出马,鲁迅终于不用背黑锅了?!
  18. win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
  19. jsp连接数据库并将数据显示到页面表格中
  20. 求职找工作的最后一步:如何Argue薪资?

热门文章

  1. Adobe illustrator 调整图例为2列 - 连载 16
  2. 刘小乐教授 - 生物信息学云论坛第三场报告会
  3. Airflow使用入门指南
  4. File Hunter for mac - 丢失文件查找AE脚本
  5. 关于PS插件Nik Collection不兼容cc2021闪退的解决方法
  6. 《小学生C++趣味编程》 第23课 打车费用
  7. 推荐一款自动化代码变量命名在线工具
  8. Linux基础学习四:Linux常用的命令(非常详细)
  9. python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)
  10. 机器人码垛搬运编程程序_码垛机器人市场进一步扩张,解放人力搬运跑不了了...