fd_set 用法 socket
来源:互联网 发布:linux压缩文件夹zip 编辑:程序博客网 时间:2024/05/26 07:27
原文:http://bbs.chinaunix.net/thread-1965490-1-1.html
select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
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集合中*/
过去,一个fd_set通常只能包含中定义常量FD_SETSIZE,它是数
据类型fd_set的描述字数量,其值通常是1024,这样就能表示 fd_set set;
FD_ZERO(&set); /*将set的所有位置0,如set在内存中占8位则将set置为
00000000*/
FD_SET(0, &set); /* 将set的第0位置1,如set原来是00000000,则现在变为10000000,这样fd==1的文件描述字就被加进set中了 */
FD_CLR(4, &set); /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了 */
FD_ISSET(5, &set); /* 测试set的第5位是否为1,如果set原来是10000100,则返回非零,表明fd==5的文件描述字在set中;否则返回0*/
―――――――――――――――――――――――――――――――――――――――
注意fd的最大值必须―――――――――――――――――――――――――――――――――――――――
select函数的接口比较简单:
int select(int nfds, fd_set *readset, fd_set *writeset,
fd_set* exceptset, struct timeval *timeout);
功能:
测试指定的fd可读?可写?有异常条件待处理?
参数:
nfds
需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中
所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1(如在readset,writeset,exceptset中所含最大的fd为
5,则nfds=6,因为fd是从0开始的)。设这个值是为提高效率,使函数不必检查fd_set的所有1024位。
readset
用来检查可读性的一组文件描述字。
writeset
用来检查可写性的一组文件描述字。
exceptset
用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)
timeout
有三种可能:
1. timeout=NULL(阻塞:直到有一个fd位被置为1函数才返回)
2. timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置为1或者时间耗尽,函数均返回)
3. timeout所指向的结构,时间设为0(非阻塞:函数检查完每个fd后立即返回)
返回值:
返回对应位仍然为1的fd的总数。
Remarks:
三组fd_set均将某些fd位置0,只有那些可读,可写以及有异常条件待处理的fd位仍然为1。
使用select函数的过程一般是:
先调用宏FD_ZERO将指定的fd_set清零,然后调用宏FD_SET将需要测试的fd加入fd_set,接着调用函数select测试fd_set中的所有fd,最后用宏FD_ISSET检查某个fd在函数select调用后,相应位是否仍然为1。
以下是一个测试单个文件描述字可读性的例子:
- int isready(int fd)
- {
- int rc;
- fd_set fds;
- struct timeval tv;
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
- tv.tv_sec = tv.tv_usec = 0;
- rc = select(fd+1, &fds, NULL, NULL, &tv);
- if (rc)
- return -1;
- return FD_ISSET(fd,&fds) ? 1 : 0;
- }
下面还有一个复杂一些的应用:
//这段代码将指定测试Socket的描述字的可读可写性,因为Socket使用的也是fd
- uint32 SocketWait(TSocket *s,bool rd,bool wr,uint32 timems)
- {
- fd_set rfds,wfds;
- #ifdef _WIN32
- TIMEVAL tv;
- #else
- struct timeval tv;
- #endif /* _WIN32 */
- FD_ZERO(&rfds);
- FD_ZERO(&wfds);
- if (rd) //TRUE
- FD_SET(*s,&rfds); //添加要测试的描述字
- if (wr) //FALSE
- FD_SET(*s,&wfds);
- tv.tv_sec=timems/1000; //second
- tv.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,否则返回0
- return 1;
- if (FD_ISSET(*s,&wfds))
- return 2;
- return 0;
- };
- }
0
上一篇:linux非阻塞式socket编程之select()用法
下一篇:necessitas
相关热门文章
- softRoCE/RDMA 安装与测试...
- jsp嵌套
- Linux之ssh连接保持与重用...
- 欢迎linuxsocket在ChinaUnix博...
- strongswan的linux内核配置...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- fd_set 用法 socket
- fd_set 用法 socket
- fd_set用法socket
- fd_set 用法 socket
- fd_set 用法 socket
- fd_set 用法 socket
- fd_set 用法 socket
- fd_set 用法 socket
- fd_set 用法
- fd_set用法
- fd_set 用法
- fd_set 用法
- fd_set用法
- fd_set 用法
- fd_set 用法
- fd_set 用法
- fd_set 用法
- fd_set 用法
- 基于 Android NDK 的学习之旅-----环境搭建[Eclipse ADT集成Cygwin编译]
- Android使用contentprovide实现对其他应用数据库的读写
- select 和 epoll的编程实现区别
- select 和 epoll的编程实现区别(2)
- linux非阻塞式socket编程之select()用法
- fd_set 用法 socket
- necessitas
- 进程间通信——管道
- 获取Java项目根目录 N多方法(转载)
- appledoc格式
- 世界首富如何炼成? 看盖茨20条箴言
- Java异常处理--将try/catch区段置于循环之外
- JVM学习笔记十一 之 编译期优化和运行期优化
- float和double类型的内存分布
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
地球仪
水平仪
测距仪
海拔测量仪
陀螺仪
心电监护仪导联位置
美容仪
无仪宁死作品
血糖仪
八礼四仪
心电监护仪
燃烧的陀螺仪
水准仪
地球仪图片
测量仪
海拔仪
水准仪使用方法
除螨仪
经纬仪
洁面仪
超级寻宝仪
地动仪
宙斯美容仪
眼部按摩仪
心电监护仪显示器图解
测亩仪
洗脸仪
陀螺仪有什么用
无仪宁死三部曲
浑天仪
测距仪app
水平仪哪个牌子好
补水仪
理疗仪
refa美容仪
多参数监护仪
有始无终无仪宁死
八礼四仪内容
露娜洁面仪
美牙仪
无仪宁死