代码之家  ›  专栏  ›  技术社区  ›  Beyondo

如何在Linux中通过索引访问fd_集中的fds?

  •  0
  • Beyondo  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  5
  •   DYZ    6 年前

    的posix实现 fd_set 不要求结构具有字段 fd_array . FDSSET 应该是不透明的数据结构。

    通过迭代所有支持的描述符,可以检查设置了哪些文件描述符( 0 通过 FD_SETSIZE-1 打电话 FD_ISSET() .

    注释 从手册页面:

    select() 只能监视小于 FD_SETSIZE poll(2) 没有这个限制。看到虫子。

        2
  •  1
  •   David Schwartz    6 年前

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