NIOSII中的LWIP协议栈中的FD_ZERO,FD_SET,FD_ISSET
来源:互联网 发布:乾坤决策眼指标源码 编辑:程序博客网 时间:2024/06/04 04:19
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通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX系统通常会在头文件中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏:
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的最大值必须
―――――――――――――――――――――――――――――――――――――――
在NIOSI IDE集成开发环境中的SOCKET.H中这样定义;
#ifndef FD_SET
#undef FD_SETSIZE
#define FD_SETSIZE 16
#define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7)))
#define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
#define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7)))
#define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p)))
typedef struct fd_set {
unsigned char fd_bits [(FD_SETSIZE+7)/8];
} fd_set;
其中P是一个fd_set类型的指针.
使用时:
fd_set readfds;
int fd_listen;
fd_listen = socket(AF_INET, SOCK_STREAM, 0);
FD_ZERO(&readfds);
FD_SET(fd_listen, &readfds);
最近才开始看这个东西,感觉不同平台上的LWIP的定义也有很多不同.
在NIOSII中定义是不是可以这样理解?
fd_bits数组只有两个元素,
FD_ZERO(&readfds); 是将分配一个内存空间给readfds,并初始化为0.
FD_SET(fd_listen, &readfds); 在readfds将fd_listen所在位置1.
http://www.eefocus.com/zhanghh624/blog/08-11/159757_0d876.html
- NIOSII中的LWIP协议栈中的FD_ZERO,FD_SET,FD_ISSET
- FD_SET,FD_ISSET,FD_ZERO,select
- FD_SET,FD_ISSET,FD_ZERO,select
- FD_ZERO,FD_SET,FD_CLR,FD_ISSET
- select ,FD_ZERO,FD_SET,FD_CLR,FD_ISSET
- select()/FD_ZERO()/FD_SET()/FD_CLR()/FD_ISSET()
- select(), FD_SET(), FD_CLR(), FD_ISSET(), FD_ZERO()
- select()/FD_ZERO()/FD_SET()/FD_CLR()/FD_ISSET() .
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- 关于工作,学习中定时备份的几个方法(cron,git,mail)
- JavaScript Prototype介绍
- 程序调试方法
- 外行学html5 - emmet 使用
- HDU 1255 ( 覆盖的面积 ) 矩形面积并
- NIOSII中的LWIP协议栈中的FD_ZERO,FD_SET,FD_ISSET
- EC纠删码(Erasure Code)校验码算法相比传统RAID5有哪些优势?
- iOS 中 coredata 的使用步骤
- UILabel加载HTML文本和字体颜色修改
- <NetCat> nc命令详解
- android studio 用 Live Templates 自动生成switch、try、for、if
- Java通信过程的中文乱码的解决
- sql修改以及添加表字段
- MySQL学习笔记--主从复制故障重置操作