2017-02-28 135 views
2

我一直在阅读的手册页中选择(从差异源)似乎并不能得到直接的解释。添加了相同的套接字fd两次FD_SET然后调用选择

可以说我有这样一个已经连接的套接字:

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

现在可以说,我添加了插座2倍(例如:误),以相同的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 
    ..... 
} 

如果数据是从套接字发送的,将选择是否已将FD设置为就绪或onl Ÿ我添加的第一个?

+1

不,将相同的套接字多次设置为相同的读取集合不会导致任何问题。可以将S1视为readfds中的索引。 – Mazhar

+0

套接字号的列表是作为(在当前场景中)'readfds'数据结构中的位图实现的,多次设置相同的位会导致对FDSET()的调用没有进一步的效果,除了第一个调用该特定的套接字号码 – user3629249

回答

6

由于FD_SET是一组(在该单词的数学含义),任何文件描述符是在要么它或它是不。不止一次向该组添加相同的描述符不起作用。