NIOSII中的LWIP協議棧中的FD_ZERO,FD_SET,FD_ISSET

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章