1.winsock select最多处理64个socket限制
<winsock2.h>第108行进行了如下定义:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
意思非常明显,也就是说winsock最多处理64个sock,其实这很好理解,select是用位操作(linux下sys/socket部分代码我也没找到,这个位操作一说是以前看资料得到的,有待验证)处理定位socket的,当然不能处理无限多(据我查资料redhat linux select模型默认处理1024个socket,也没检查源代码)。
一个非常直观的想法是如果想让select处理更多socket,可以修改这个宏定义,事实上是可以的,但是恐怕这个值的设定是操作系统开发者衡量系统和select本身的性能设定的,随意修改未必是好事(网上查到资料说这个值单cpu最大设为256比较合适)。
如果确实要用select处理很多socket,把socket分组使用多线程模式比较合理,我个人的感觉是,从性能上来说减少遍历处理数量可以获得提升。
2.使用select模式让一个线程监听多个端口
据我现在的知识而言,一个socket监听多个端口是不可能的,但是select却可以不使用多线程的前提下让同一应用监听多个端口(这个说出来大家就都会用了把^_^)。