zoukankan      html  css  js  c++  java
  • select()2

    只要接触过c/c++网路编程人都可能会知道select io 模式,网络书籍都说 fd_set {int num; SOCKET arr[64]} 有所限制,因为数组的长度只有64,那么超过64你就不能放,要么你就是用多线程分别实用select.。
    一些书籍通过改定义宏 使数组的长度变长,但也不实用,不能动态的变化,我总不能定一个非常的长的长度,毕竟是在栈上。
       我就在想那么select完全只能在客户端使用,而且套接字还不能超过64。那这不就是一个软肋吗??一直对这个有一个迷惑。。。。。
     
       后来,自己看到了libevent的源代码发现他也用的是select。。看别人说这个库,轻轻松松处理上万个套接字,我就在想select不是有限制吗??他是怎么做到。。。。。。
    看了源代码,我明白了。他只是用对上存放SOCKET的句柄。。我们看一下他的新定义结构体。
     
    struct win_fd_set {
    u_int fd_count;
    SOCKET fd_array[1];
    };
     
    这个就是新定义结构体,跟原来稍微有点变化只是把64改为1,有些同学可能见多很多这样的写法,这种写法我也在一些项目使用了。这种写法可以fd_array动态变化。
    win_fd_set * Set = (win_fd_set*)malloc(sizeof(win_fd_set) + sizoef(SCOEKT) * 10);
    Set->fd_array 可以放11 个 SOCKET,因为我的内存大小足够放11个SOCKET。
    请记住内存是没有数据格式,只要足够大小,随便你怎么放。数据格式只是方便我们管理和处理数据而已。
    这样就解决64个大小限制。。我其实一直很好奇为什么中国书籍都是一样的,libevent已经出来好久了,但也没有看到有人说这一点,可能是高手们都不屑。
    现在渐渐喜欢看开源的代码,不喜欢看书籍了,喜欢在代码中学习他们是怎么组织一个好项目。
    有时候感慨:高手用c 写着漂亮的c++代码,而我等菜鸟却用c++ 写丑陋的c代码。。
  • 相关阅读:
    LeetCode 67 Add Binary(二进制相加)(*)
    从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志
    Registration system
    BZOJ 1055 HAOI2008 玩具取名 动态规划
    9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中
    B-Tree 索引和 Hash 索引的对照
    负载均衡之基于DNS负载
    Eclipse中git插件导入远程库和上传项目源代码到远程库
    Android开发艺术-第二章 IPC 机制
    一天教你入门struts2
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3956023.html
Copyright © 2011-2022 走看看