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


0 0
原创粉丝点击