Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将相同的套接字fd添加到fd_集合两次,然后调用select_C_Sockets_Select_Networking - Fatal编程技术网

将相同的套接字fd添加到fd_集合两次,然后调用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

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

假设我有一个已连接的插座,如下所示:

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()的调用没有进一步的效果,除了对该特定套接字编号的第一次调用