【发布时间】:2016-03-03 01:23:43
【问题描述】:
我知道 select 在返回时会修改输入集。但是怎么做? 输入集中的 fd 将如何不在输入集中?在我看来,fd_isset(fd) 将返回 true,只要 fd 一开始就在输入集中。那么 select() 究竟是如何修改其输入集的呢?
这是 fd_set 结构:
typedef struct fd_set {
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} fd_set;
那么 select() 会更新哪些字段?我们仍然想跟踪所有 fd,所以我看不出 select() 更改 fd_count 或 fd_array 有什么意义?那么,select() 有什么变化呢?
来自手册页:
“在退出时,集合被修改以指示哪些文件描述符实际改变了状态。”
但是关于这些集合的哪些方面被修改的细节明显缺失。
编辑: 针对答案: 那么以下是正确的使用方法吗?
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...
-
“哪些文件描述符实际上改变了状态”对我来说非常清楚。为什么要修改计数?
-
除了缺少
&之外,您在更新中插入的代码似乎是使用select()的有效方式。它是否真的有效取决于该代码出现的上下文的许多细节。 -
@JohnBollinger:代码出现的上下文如下:stackoverflow.com/questions/35762852/…
标签: c sockets select network-programming