Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Поля fd_set


Автор: Enelar 25.6.2010, 01:06
Как называются поля структуры fd_set (для сокетов) в линухе.
Мне неприемлемо пользоваться макросами типа FD_SET, а нужно писать напрямую.
Например в винде поля называются fd_count и fd_array и я просто пишу
Код

    for (int i = 0; i < FD_SETSIZE; i++)

      if (Bank[i] != INVALID_SOCKET && Bank[i] != 0)

      arr.fd_array[j++] = Bank[i];

    arr.fd_count = j;

как это сделать в линухе?
Код

    for (int i = 0; i < FD_SETSIZE; i++)

      if (Bank[i] > -1 && Bank[i] != 0)

      arr./*???*/[j++] = Bank[i];

    arr./*???*/ = j;

Автор: Enelar 25.6.2010, 01:57
Слава гуглу!
Код

#ifndef    FD_SETSIZE
#define    FD_SETSIZE    1024
#endif
#define    NBBY    8        /* number of bits in a byte */
typedef    long    fd_mask;
#define    NFDBITS    (sizeof (fd_mask) * NBBY)    /* bits per mask */
#define    howmany(x,y)    (((x)+((y)-1))/(y))
typedef    struct _types_fd_set {
    fd_mask    fds_bits[howmany(FD_SETSIZE, NFDBITS)];
} _types_fd_set;

#define fd_set _types_fd_set

вопрос закрыт

Автор: Enelar 25.6.2010, 02:26
кстати я может что то не понимаю... но кажется в макросе howmany должен стоять знак умножить.
или я не прав...

теперь понял)

Автор: Enelar 25.6.2010, 04:44
Нет, вопрос нифига не решен.
Если добавление сокета я сделал через FD_SET
то поиск сокета FD_ISSET меня совсем не устраивает, оно будет долго в моей идеологии. 
посему вопрос, как из структуры fd_set вытянуть сокет.
(в винде это было просто a.fd_array[i])
здесь же сокет номер 4 превращяется в 16. (побитовый сдвиг вправо на два ничего не дает)

Автор: Enelar 25.6.2010, 05:17
если сокет имеет сообщение, то i-ый бит fds_bits = 1 (где i = дескриптору сокета).
При больших количествах сокетов на лицо геморой, но я надеюсь что это не так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)