fd setsize mysql_突破select的FD_SETSIZE限制

前言:

在很多比较各种网络模型的文章中,但凡提到select模型时,都会说select受限于轮询的套接字数量,这个

数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。

C语言的偏方:

在C语言的世界里存在一个关于结构体的偏门技巧,例如:

cbef093dcc044b2793832001e2365e43.pngtypedef struct _str_type

2f88ce130b654eb5dc6788e02dbcfc90.png{

df37983f39daa189b8c814e01a6a9011.png    int _len;

df37983f39daa189b8c814e01a6a9011.png    char _s[1];

0ac3a2d53663ec01c7f7225264eeefae.png}str_type;

str_type用于保存字符串(我只是举例,事实上这个结构体没什么用处),乍看上去str_type只能保存长度为

1的字符串('\0')。但是,通过写下如下的代码,你将突破这个限制:

cbef093dcc044b2793832001e2365e43.pngint str_len = 5;

cbef093dcc044b2793832001e2365e43.pngstr_type *s = (str_type*) malloc( sizeof( str_type ) + str_len - 1 );

cbef093dcc044b2793832001e2365e43.png//918e8df969f9f8c8d002f25cda86cade.pngcbef093dcc044b2793832001e2365e43.pngfree( s ); 

cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.png

这个技巧原理很简单,因为_s恰好在结构体尾部,所以可以为其分配一段连续的空间,只要注意指针的使用,

这个就算不上代码上的罪恶。但是这个技巧有个限制,str_type定义的变量必须是被分配在堆上,否则会破

坏堆栈。另外,需要动态增长的成员需要位于结构体的末尾。最后,一个忠告就是,这个是C语言里的技巧,

如果你的结构体包含了C++的东西,这个技巧将不再安全()。

其实select也可以这样做:

事实上,因为select涉及到的fd_set是一个完全满足上述要求的结构体:

cbef093dcc044b2793832001e2365e43.pngwinsock2.h : 

cbef093dcc044b2793832001e2365e43.png

2f88ce130b654eb5dc6788e02dbcfc90.pngtypedef struct fd_set {

f70a0fde2b51b7dd92a70e712e540cf6.png        u_int fd_count;               /*how many are SET?*/

f70a0fde2b51b7dd92a70e712e540cf6.png        SOCKET  fd_array[FD_SETSIZE];   /*an array of SOCKETs*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值