[英]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
應該是不透明的數據結構。
您可以通過迭代所有受支持的描述符( 0
到FD_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.