例如,我可以在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 回答
添加一个新变量,可能是
max_fd
,用于跟踪集合中编号最大的文件描述符 . 然后你可以这样做:但你可能最好使用
poll
而不是select
.fd_set
的POSIX实现不要求结构具有字段fd_array
.fd_set
应该是一个不透明的数据结构 .您可以通过遍历所有支持的描述符(
0
到FD_SETSIZE-1
)并调用FD_ISSET()
来检查设置了哪些文件描述符 .Note 来自手册页: