C/C++ select fd_set解释
将套接口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解释相关推荐
- linux—select具体解释
linux-select具体解释 select系统调用时用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变. 关于文件句柄,事 ...
- Linux下I/O多路转接之select --fd_set
fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...
- jqurey操作select 语法解释
jQuery获取Select选择的Text和Value: 语法解释: 1. $("#selectId").change(function(){ ... }); //为Select添 ...
- select fd_set
2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字. 文件描述符fd的值 不能超过1024,而不是数量不能超过1024. 在开发打开句柄多的程序时 ...
- 彻底解释Linux select的1024限制(select真的受1024限制吗?不!)
很多很多年前,我被面试 为什么select调用最多只支持1024个文件描述符? 我没有答出来,我甚至不知道select到底是干什么的. 又过了很多年,我用这个问题面试了别人- 在当时,我心里已经有了会 ...
- C++网络编程快速入门(二):Linux下使用select演示简单服务端程序
目录 select参数解释 select使用规范 select使用缺点 基本流程 实例代码 通信效果演示 往期文章 select参数解释 extern int select (int __nfds, ...
- select和epoll的区别详解
1. 名词解释 1.1 文件描述符fd 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念. 文件描述符在形式上是一个非负整数.实际上,它是 ...
- select poll epoll 高效IO 多路转接
目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...
- MyBatis-03 MyBatis XML方式之select元素
概述 select用法 根据用户id查询用户信息 1.UserMapper接口中添加接口方法 2. UserMapper.xml中配置resultMap和select元素 查询全部的SysUser 添 ...
最新文章
- windows操作系统的引导过程描述
- 这里有一个3天的秘境邀请!
- ios设置tabbar背景颜色_WooCommerce微信小程序2.9.3版本发布 后台设置主题色 底栏装修定制...
- linux tr命令详解
- 给大家几个不花钱看书的办法【人人都是产品经理】
- IOS开发基础之手势解锁项目案例
- JQuery对象与DOM对象的区别与转换
- django本地安装mysql_Ununtu 15.04 安装MySql(Django连接Mysql)
- easyui前端实现多选框_EasyUI实现下拉框多选功能
- Chrome浏览器 开发者工具中的 Performance
- python 和scikit安装
- YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行
- 计算机无法屏幕亮度,今天详解win10电脑屏幕亮度无法调节的具体解决手法
- 内网穿透工具-venom
- 关于PSINS运动轨迹仿真模块的理解和思考
- 探索C语言之字符串分割函数:strtok和strsep的区别
- 程序猿出马,鲁迅终于不用背黑锅了?!
- win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
- jsp连接数据库并将数据显示到页面表格中
- 求职找工作的最后一步:如何Argue薪资?
热门文章
- Adobe illustrator 调整图例为2列 - 连载 16
- 刘小乐教授 - 生物信息学云论坛第三场报告会
- Airflow使用入门指南
- File Hunter for mac - 丢失文件查找AE脚本
- 关于PS插件Nik Collection不兼容cc2021闪退的解决方法
- 《小学生C++趣味编程》 第23课 打车费用
- 推荐一款自动化代码变量命名在线工具
- Linux基础学习四:Linux常用的命令(非常详细)
- python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)
- 机器人码垛搬运编程程序_码垛机器人市场进一步扩张,解放人力搬运跑不了了...