我知道選擇在返回時修改輸入集。但是如何? 輸入集中的fd如何不在輸入集中? fd_isset(fd)將返回true,在我看來,只要fd在開始處的輸入集中。那麼select()如何修改其輸入集呢?select()如何修改其輸入集?
這是FD_SET結構:
typedef struct fd_set {
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} fd_set;
那麼哪些字段將被選擇進行更新()?我們仍然想跟蹤所有的fd,所以我不明白select()更改fd_count或fd_array是否合理?那麼,select()會改變什麼?
從手冊頁:
「退出時,集合到位,以指示哪些文件描述符實際上改變狀態的影響。」
但是,有關組中的WHAT方面的細節已經明顯缺失。
編輯: 對此問題的回答: 那麼下面是正確的使用方法嗎?
while (not error and not socket closes){
FD_ZERO(&readSet);
FD_ZERO(&writeSet);
FD_SET(fd, &readSet);
FD_SET(socket_num, &readSet);
FD_SET(fd, &writeSet);
FD_SET(socket_num, &writeSet);
select(nfds, &readSet, writeSet, NULL, NULL);
if(FD_ISSET(fd, &readSet)){
read(fd, buf, sizeof(buf));
write(socket_num, buf, sizeof(buf));
/*memset(buf, 0, sizeof(buf));*/
}
if(FD_ISSET(socket_num, &readSet)){
read(socket_num, buf, sizeof(buf));
write(fd, buf, sizeof(buf));
}
}
請推薦相關標籤。唯一我能想到的是c ... –
「哪些文件描述符實際上改變了狀態」對我來說非常清楚。爲什麼要修改計數? – Olaf
除了缺少一個'&'之外,你插入更新的代碼看起來好像它可能是使用'select()'的有效方法。它實際上是否有效取決於該代碼出現的上下文的許多細節。 –