您的位置:首页 > 编程语言 > C语言/C++

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

2011-05-17 20:38 274 查看
在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要慎重!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: