首页 文章

如何通过Linux中的索引访问fd_set中的FD?

提问于
浏览
0

例如,我可以在Windows中使用 fd_set.fd_array[i] 访问它们 .

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 回答

  • 5

    添加一个新变量,可能是 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 .

  • 1

    fd_set 的POSIX实现不要求结构具有字段 fd_array . fd_set 应该是一个不透明的数据结构 .

    您可以通过遍历所有支持的描述符( 0FD_SETSIZE-1 )并调用 FD_ISSET() 来检查设置了哪些文件描述符 .

    Note 来自手册页:

    select()只能监视小于FD_SETSIZE的文件描述符数;民意调查(2)没有这个限制 . 见BUGS .

相关问题