Как получить доступ к FD в fd_set через индексацию в Linux? - PullRequest
0 голосов
/ 10 декабря 2018

Например, я могу получить к ним доступ с помощью fd_set.fd_array[i] в Windows ..

request_list getIncomingRequests()
{
    fd_set master_set_copy = master_set;
    request_list requests;
    int socket_count = select(0, &master_set_copy, nullptr, nullptr, nullptr);
    for (int i = 0; i < socket_count; ++i)
    {
    #ifdef _WIN32
        auto req_fd = master_set_copy.fd_array[i];
    #else
        auto req_fd = master_set_copy...[i]; // ??
    #endif
        sockaddr_in req_addr;
        getsockname(req_fd, (sockaddr*)&req_addr, &addr_len);
        requests.push_back(request(req_fd, this->fd, req_addr));
    }
    return requests;
}

Но fd_array не существует в Linux, поэтому мне нужен эквивалент.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Добавить новую переменную, возможно, max_fd, которая отслеживает дескриптор файла с наибольшим номером в наборе.Тогда вы можете сделать это:

request_list getIncomingRequests()
{
    fd_set master_set_copy = master_set;
    request_list requests;
    int socket_count = select(max_fd + 1, &master_set_copy, nullptr, nullptr, nullptr);
    for (int req_fd = 0; req_fd <= max_fd; ++req_fd)
    {
        if (!FD_ISSET(req_fd, &master_set_copy))
            continue;
        sockaddr_in req_addr;
        getsockname(req_fd, (sockaddr*)&req_addr, &addr_len);
        requests.push_back(request(req_fd, this->fd, req_addr));
    }
    return requests;
}

Но вам, вероятно, лучше использовать poll вместо select.

0 голосов
/ 10 декабря 2018

Реализация POSIX fd_set не требует, чтобы структура имела поле fd_array.fd_set предполагается непрозрачной структурой данных.

Вы можете проверить, какие файловые дескрипторы установлены, перебирая все поддерживаемые дескрипторы (0 - FD_SETSIZE-1) и вызывая FD_ISSET().

Примечание изстраница справочника:

select() может отслеживать только те дескрипторы файлов, которые меньше FD_SETSIZE;poll(2) не имеет этого ограничения.Смотрите ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...