将相同的套接字fd添加到fd_集合两次,然后调用select
我一直在阅读select(来自不同来源)的手册页,似乎无法得到一个直接的解释 假设我有一个已连接的插座,如下所示:将相同的套接字fd添加到fd_集合两次,然后调用select,c,sockets,select,networking,C,Sockets,Select,Networking,我一直在阅读select(来自不同来源)的手册页,似乎无法得到一个直接的解释 假设我有一个已连接的插座,如下所示: s1 = socket(...); connect(s1, ...)... 现在让我们假设我向同一个fd_集合添加了两次套接字(例如:错误),如下所示: fd_set readfds; FD_ZERO(&readfds); FD_SET(s1, &readfds); .... FD_SET(s1, &readfds); 现在我调用select: in
s1 = socket(...);
connect(s1, ...)...
现在让我们假设我向同一个fd_集合添加了两次套接字(例如:错误),如下所示:
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
.....
}
如果从套接字发送数据,将选择是否将两个FD都设置为就绪,或者仅将我添加的第一个FD设置为就绪?因为
FD\u set
是一个集合(在单词的数学意义上),所以任何文件描述符要么在其中,要么不在其中。多次向集合中添加同一描述符无效。否,将同一套接字多次设置到同一读取集合中不会导致任何问题。S1可以被视为readfds中的索引。套接字编号列表作为(在当前场景中)readfds
数据结构中的位图实现,多次设置相同的位会导致对FDSET()的调用没有进一步的效果,除了对该特定套接字编号的第一次调用