C++ 如何在Linux中通过索引访问fd_集中的FDs?
例如,我可以在Windows中使用fd_set.fd_array[I]访问它们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
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_集。