FD_SET макросы

Тема в разделе "WASM.NETWORKS", создана пользователем faceless, 27 дек 2005.

  1. faceless

    faceless New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2005
    Сообщения:
    3
    Адрес:
    Russia
    Подскажите пожалуйста где я могу найти макросы для работы со структурой fd_set (FD_ZERO, FD_ISSET ... ) или хотя бы описание того, как правильно с ней обращаться
     
  2. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    winsock2.h ?



    #ifndef FD_SETSIZE

    #define FD_SETSIZE 64

    #endif /* FD_SETSIZE */



    typedef struct fd_set {

    u_int fd_count; /* how many are SET? */

    SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */

    } fd_set;





    #define FD_SET(fd, set) do { \

    u_int __i; \

    for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \

    if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \

    break; \

    } \

    } \

    if (__i == ((fd_set FAR *)(set))->fd_count) { \

    if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \

    ((fd_set FAR *)(set))->fd_array[__i] = (fd); \

    ((fd_set FAR *)(set))->fd_count++; \

    } \

    } \

    } while(0)
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898


    описание как с этим общаться надо искать у Стивенса. Хотя я стивенса не читал, и обычно консультируюсь с info libc (есть и online версия мануала glibc). Если тебе действительно виндовая версия нужна, помочь ничем не могу, в *nix, это надо искать в ...



    man select вот что говорит:



    /* According to POSIX 1003.1-2001 */

    #include <sys/select.h>



    /* According to earlier standards */

    #include <sys/time.h>

    #include <sys/types.h>

    #include <unistd.h>
     
  4. faceless

    faceless New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2005
    Сообщения:
    3
    Адрес:
    Russia
    нужно именно виндовая.. если я правильно поняла они могут отличаться от никсовых..

    Спасиба большое :) пойду тестить
     
  5. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    FDZERO MACRO fds

    mov fds.fd_count, 0

    ENDM



    FDSET MACRO hSocket, fds

    mov eax, hSocket

    mov ecx, fds.fd_count

    shl ecx, 2

    mov fds.fd_array[ecx], eax

    inc fds.fd_count

    ENDM
     
  6. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    FD_SET макрос для СиПлюсПлюс. Вот его код:



    #define FD_SET(fd, set) do { \

    if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) \

    ((fd_set FAR *)(set))->fd_array[((fd_set FAR *)(set))->fd_count++]=(fd);\

    } while(0)



    Взято из "WINSOCK.H" из Visual C++ 6. В других include-файлах может быть другое определение этого макроса. Например, из Platform SDK SP2:

    #define FD_SET(fd, set) do { \

    u_int __i; \

    for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \

    if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \

    break; \

    } \

    } \

    if (__i == ((fd_set FAR *)(set))->fd_count) { \

    if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \

    ((fd_set FAR *)(set))->fd_array[__i] = (fd); \

    ((fd_set FAR *)(set))->fd_count++; \

    } \

    } \

    } while(0)

    Но делаеют они одно и тоже. Во втором случае проверяется нет ли сокета s уже в наборе. Да и я не знаю зачем сделали так:

    do

    {

    statements;

    }

    while(0)



    Похоже программисты у mIcRo$ofT тоже ленивые как и мы ;)

    Хотя скорее всего это сделанно умышленно, потому что в блоке создаются свои локальные(или как там их называют)переменные.

    Макрос FD_SET нужен для добавления сокета s в набор set. А наборы используются в функции select(...). В набор добавляется сокет, который нужно проверить, например можно ли в него писать. Тогда с помощью FD_SET добавляем сокет в набор и указаываем параметром select указатель на набор. Если после вызова функции сокет до сих пор входит в набор,

    то писать в него можно.

    Остальные макросы:

    FD_CLR - удаляет сокет их набора:

    #define FD_CLR(fd, set) do { \

    u_int __i; \

    for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \

    if (((fd_set FAR *)(set))->fd_array[__i] == fd) { \

    while (__i < ((fd_set FAR *)(set))->fd_count-1) { \

    ((fd_set FAR *)(set))->fd_array[__i] = \

    ((fd_set FAR *)(set))->fd_array[__i+1]; \

    __i++; \

    } \

    ((fd_set FAR *)(set))->fd_count--; \

    break; \

    } \

    } \

    } while(0)

    FD_ISSET - проверяет, входит ли в набор сокет:

    #define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set))



    FD_ZERO - делает пустой набор:

    #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)



    Почитать можно код. Потому что вот всё что сказано в MSDN про эти макросы :

    "Since sockets are not represented by the UNIX-style, small, non-negative integer, the implementation of the select function was changed in Windows Sockets. Each set of sockets is still represented by the FD_SET structure, but instead of being stored as a bitmask, the set is implemented as an array of sockets. To avoid potential problems, applications must adhere to the use of the FD_XXX macros to set, initialize, clear, and check the FD_SET structures.



    "