[C++] 关于FD_SETSIZE大小的问题

在linux里,提到网络编程,就会涉及到select,多路复用IO,虽然这个效率不是很高,但是对于一般应用还是足够了。

我写了一个小程序,如下:

 

#include <sys/select.h> #include <sys/socket.h> #include <stdio.h> #define NUM 2000 int fds[NUM]; int main() { for( int i = 0; i < NUM; ++i ) { printf("[%d]/t", i); if( ( fds[i] = socket( AF_INET, SOCK_STREAM, 0 ) ) >= 0 ) { printf( "%d/n",fds[i] ); fd_set rset; FD_ZERO(&rset); FD_SET( fds[i], &rset); } else { printf( "fail/n" ); } } printf( "succ/n" ); return 0; }

 

输出结果是:

 

[0] 3 [1] 4 [2] 5 [3] 6 [4] 7 [5] 8 [6] 9 [7] 10 [8] 11 [9] 12 [10] 13 [11] 14 [12] 15 [13] 16 [14] 17 [15] 18 [16] 19 [17] 20 …… [1014] 1017 [1015] 1018 [1016] 1019 [1017] 1020 [1018] 1021 [1019] 1022 [1020] 1023 [1021] 1024 [1022] 1025 [1023] 1026 [1024] 1027 [1033] 1028 [1050] 1029 [1083] 1030 [1148] 1031 [1277] 1032 [1534] 1033 succ

 

看样子没有到达我设置的2000就结束打印了,而且结果中没有fail。。。

 

后来查询,发现FD_SET的第一个参数不能超过FD_SETSIZE(在<bits/typesizes.h>里定义,我这里为1024),可以看到在超过这个值以后,打印就不规律了,我猜测可能是踩到了后面的代码,并且越踩越远,最后正好踩出了循环体,但是没有出core,并打印了succ,不过具体过程没有仔细琢磨。

 

所以使用FD_SET要慎重!!!!

 

 

 

 

 

你可能感兴趣的:(编程,C++,linux,socket,Stream)