在fd_set中添加了两次相同的套接字fd,然后调用select

时间:2017-02-28 07:26:57

标签: c sockets select networking

我一直在阅读选择的手册页(来自不同来源),似乎无法得到直接的解释。

假设我已经连接了这样的套接字:

s1 = socket(...);
connect(s1, ...)...

现在假设我将套接字添加两次(例如:错误地)到同一个fd_set,如下所示:

fd_set readfds;


FD_ZERO(&readfds);
FD_SET(s1, &readfds);
....
FD_SET(s1, &readfds);

现在我打电话给选择:

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
   .....
}

如果数据是从套接字发送的,那么会选择将两个FD设置为就绪还是只设置我添加的第一个?

1 个答案:

答案 0 :(得分:6)

由于FD_SET是一个集合(在单词的数学意义上),任何文件描述符都是 in 它或不是。多次向集合中添加相同的描述符无效。