zoukankan      html  css  js  c++  java
  • 项目中libevent几个问题

    几个问题:
    1.libevent到底用的是select还是iocp,然后是如何突破64限制的
    typedef struct fd_set {
            u_int   fd_count;               /* how many are SET? */
            SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
    } fd
    首先libevent使用的是select,至于为什么不用iocp,有可能没有实现
    #define FD_SETSIZE      64
    看到这个就以为最多是64个连接,
    那时因为这个是在暂时分配栈的内存,如果分配在堆上就可以解决
    看Libevent里面
    struct win_fd_set {
    u_int fd_count;
    SOCKET fd_array[1];
    };
    然后在堆上分配内存,就可以动态指定大小,只要内存可以存放
    具体看http://www.cnblogs.com/ayanmw/p/3467373.html
    2.客户端为什么要监听
    看到客户端监听的端口比较随便,所以个人判断这个监听是没用的,也许只是为了和服务端的代码重用,主要是为了使用下面的派发线程
    m_spThread.reset(new std::thread([this]
    {
        //SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
        //event_base_loop(m_base, EVLOOP_ONCE);
        event_base_dispatch(m_base);
        if(WSAENOTSOCK == WSAGetLastError())
        {
            Plug::PlugMessageBox(L"操作无效套接字啊!");
        }
        
        Plug::PlugMessageBox(L"Libevent派发线程退出!");
    }));
    
    3.什么时候调用读事件和写事件,往哪儿写,从哪儿读
    当input有数据的时候调用读事件,当Output为空的时候调用写事件
    读是从Input读,写是往output写
    bufferevent_setcb(bev, conn_readcb, NULL, conn_eventcb, c2);//NULL表示bufferevent不会进行数据的读取或者写入
    bufferevent_enable(bev, EV_READ | EV_WRITE );
    服务器不用设置写事件,而是自己调用bufferevent_write向output写入数据的
    客户端设置了写事件,然后也是自己调用的bufferevent_write,但这个写事件回调里面没做什么东西,只有当output没有数据的时候才会调用这个写事件
    3.channelid到底对应的是啥,到底是如何实现这么多客户端并发的:
    现在知道channelid对应一个bufferevent,而bufferevent对应一个socket,这样就确定是哪个客户端了,然后select模式知道哪些socket可读,可写,然后就自动的往socket写,或者从socket读
    
    4.两句代码的理解
        //设置读写回调,当input有数据的时候需要调用conn_readcb,这个是libevent自动调用的
        bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb, c2);
        
        //我去这个有点坑啊,这个EV_WIRTE是默认设置的,bufferevent_get_enabled默认得到的是6
        //EV_WRITE和EV_READ是指socket和缓冲区之间的读和写
        bufferevent_enable(bev, EV_READ);
    
    5.写事件
    至于服务器为什么不设置写回调函数,真心不知道,这个还真不太清楚为啥,但客户端设置了
  • 相关阅读:
    【数据库】不同数据库对于between and的处理 对于取查到的第一个的处理
    【调试】用chrome调试获得时间戳
    【js】js时间格式化
    【js】vue时间格式转化
    【js】ztree
    我的mybatis入门宝典
    mybatis一对多双向映射
    java为什么不支持多继承
    java的八种数据类型
    java中的异常 try catch
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3957912.html
Copyright © 2011-2022 走看看