【发布时间】:2017-07-19 01:29:40
【问题描述】:
我一直在阅读 select 的手册页(来自不同的来源),似乎无法得到直接的解释。
假设我已经连接了一个这样的套接字:
s1 = socket(...);
connect(s1, ...)...
现在假设我将套接字两次(例如:错误地)添加到同一个 fd_set,如下所示:
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(s1, &readfds);
....
FD_SET(s1, &readfds);
现在我调用 select:
int rv = select(n, &readfds, NULL, NULL, &tv);
if (rv == -1) {
perror("select"); // error occurred in select()
}
else if (rv == 0) {
printf("Timeout occurred! No data after 10.5 seconds.\n");
}
else {
// one the descriptors have data
.....
}
如果数据是从套接字发送的,select 会将两个 FD 都设置为就绪,还是只设置我添加的第一个?
【问题讨论】:
-
不,将同一个套接字多次设置到同一个读取集中不会导致任何问题。 S1 可以看作是 readfds 中的一个索引。
-
套接字编号列表在(在当前场景中)
readfds数据结构内实现为位图,多次设置同一位会导致对 FDSET() 的调用没有进一步的效果,除了第一次调用那个特定的套接字号
标签: c sockets select networking