注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【服务器框架】Unix平台,select网络模型的最大并发连接数问题  

2010-05-25 01:48:43|  分类: linux、FreeBSD等 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Unix的select网络模型很好,一次可以select  1024个套接字,而Windows只能是64个。

然而,我看了一下Unix的select宏的代码,很是疑惑不解。


#ifndef FD_SETSIZE
#define FD_SETSIZE 1024U                                                   //这是总的套接字个数
#endif

#define _NFDBITS (sizeof(__fd_mask) * 8) /* bits per mask */
#if __BSD_VISIBLE
#define NFDBITS  _NFDBITS
#endif

#ifndef _howmany
#define _howmany(x, y) (((x) + ((y) - 1)) / (y))
#endif

typedef struct fd_set {
 __fd_mask __fds_bits[_howmany(FD_SETSIZE, _NFDBITS)];
} fd_set;
#if __BSD_VISIBLE
#define fds_bits __fds_bits
#endif

#define __fdset_mask(n) ((__fd_mask)1 << ((n) % _NFDBITS))
#define FD_CLR(n, p) ((p)->__fds_bits[(n)/_NFDBITS] &= ~__fdset_mask(n))
#if __BSD_VISIBLE
#define FD_COPY(f, t) (void)(*(t) = *(f))
#endif
#define FD_ISSET(n, p) (((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0)
#define FD_SET(n, p) ((p)->__fds_bits[(n)/_NFDBITS] |= __fdset_mask(n))
#define FD_ZERO(p) do {     \
 fd_set *_p;     \
 __size_t _n;     \
       \
 _p = (p);     \
 _n = _howmany(FD_SETSIZE, _NFDBITS);  \
 while (_n > 0)     \
  _p->__fds_bits[--_n] = 0;  \
} while (0)

 

        这个代码中,fd_set结构体中,并没有保存套接字句柄。这就意味着,它只是根据比特位来确定是哪个套接字。我试着sizeof(fd_set)来计算它的大小,得到的结果是:128。128×8=1024,所以,fd_set不保存套接字句柄!这和windows平台的不同。

        虽然,windows平台,一次只能select 64个套接字,但是,加上多线程,处理几千个套接字也是可以的。而Unix平台,照这么处理,最多1024个套接字!因为如果再多的话,结构体会出现内存溢出的!

        这里的讨论证实了上面的结论:http://topic.csdn.net/t/20050107/14/3707093.html

gaoxianfeng

一般linux系统是用一个长度为32的uint32数组来存放处理select的
这是系统内核编译时定义好的
数组中每一个bit理解为一个socket
所以32*4*8   =   1024
如果你要更改就需重编译内核

不过如果select过多连接,处理时会变慢,可以多进程处理连接   发送给一个服务进程,服务进程通过进程id   fd   区分不同的连接.   处理完后给各相应进程
这样各司其职   就好处理

 

By: zhanyonhu


  评论这张
 
阅读(1530)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016