簡體   English   中英

如何通過Linux中的索引訪問fd_set中的FD?

[英]How to access FDs in fd_set through indexing in Linux?

例如,我可以在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中不存在,因此我需要一個等效的。

fd_set的POSIX實現不需要結構具有字段fd_array fd_set應該是不透明的數據結構。

您可以通過迭代所有受支持的描述符( 0FD_SETSIZE-1 )並調用FD_ISSET()來檢查設置了哪些文件描述符。

手冊頁中的注釋

select()只能監視小於FD_SETSIZE文件描述符號; poll(2)沒有此限制。 參見錯誤。

添加一個新變量,也許是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM