C++ 如何在Linux中通过索引访问fd_集中的FDs?

C++ 如何在Linux中通过索引访问fd_集中的FDs?,c++,c,linux,sockets,networking,C++,C,Linux,Sockets,Networking,例如,我可以在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

例如,我可以在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_数组在Linux中不存在,所以我需要一个等效的。fd_集的POSIX实现不要求结构具有字段fd_数组。fd_集应该是一个不透明的数据结构

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

手册页的注释:

选择只能监视小于FD_SETSIZE的文件描述符编号;poll2没有这个限制。看看虫子


fd_集的POSIX实现不要求结构具有字段fd_数组。fd_集应该是一个不透明的数据结构

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

手册页的注释:

选择只能监视小于FD_SETSIZE的文件描述符编号;poll2没有这个限制。看看虫子

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

添加一个新变量,可能是max\u 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;
}

<>但是你最好用轮询代替选择。< /P> C和C++是两种不同的语言。请删除其中一个标签。您可以编辑您想要实现的目标的开头和结尾吗?这对我来说是个太普通的问题,我知道,但是套接字API是C和C++的,而不是仅仅用于它们。@ TurthuTyTy我只想通过索引来访问FDSUT中的任何套接字。@ XMyLead直接不能直接使用Windows代码。C和C++所建议的修改是两种不同的语言。请删除其中一个标签。您可以编辑您想要实现的目标的开头和结尾吗?这对我来说是个太普通的问题,我知道,但是套接字API是C和C++的,而不是仅仅用于它们。@ TurthuTyTy我只想通过索引来访问FDSUT中的任何套接字。@ XMyLead直接不能直接使用Windows代码。正如我所建议的,只需要很少的修改,我还需要将select中的第一个参数设置为FD_SETSIZE。它在没有它的情况下在Windows中工作真的很奇怪,但是。。谢谢。如果是这样的话,我想我会用poll。用poll。select太糟糕了。@Linux上的XStylish套接字使用描述符,因此需要告诉select要监视的最高描述符。但是Windows上的套接字是内核对象,select的第一个参数被忽略。这是记录在案的行为。此外,由于fd_集是不透明的,在某些平台上,您需要使用fd_COPY将一个fd_集复制到另一个fd_集。我还需要将select中的第一个参数设置为fd_SETSIZE。它在没有它的情况下在Windows中工作真的很奇怪,但是。。谢谢。如果是这样的话,我想我会用poll。用poll。select太糟糕了。@Linux上的XStylish套接字使用描述符,因此需要告诉select要监视的最高描述符。但是Windows上的套接字是内核对象,select的第一个参数被忽略。这是记录在案的行为。此外,由于fd_集是不透明的,在某些平台上,您需要使用fd_COPY将一个fd_集复制到另一个fd_集。