几个问题:
.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[];
};
然后在堆上分配内存,就可以动态指定大小,只要内存可以存放
具体看http://www.cnblogs.com/ayanmw/p/3467373.html
.客户端为什么要监听
看到客户端监听的端口比较随便,所以个人判断这个监听是没用的,也许只是为了和服务端的代码重用,主要是为了使用下面的派发线程
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派发线程退出!");
})); .什么时候调用读事件和写事件,往哪儿写,从哪儿读
当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没有数据的时候才会调用这个写事件
.channelid到底对应的是啥,到底是如何实现这么多客户端并发的:
现在知道channelid对应一个bufferevent,而bufferevent对应一个socket,这样就确定是哪个客户端了,然后select模式知道哪些socket可读,可写,然后就自动的往socket写,或者从socket读 .两句代码的理解
//设置读写回调,当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); .写事件
至于服务器为什么不设置写回调函数,真心不知道,这个还真不太清楚为啥,但客户端设置了

最新文章

  1. 读《Android编程权威指南》
  2. UIWebView中加载HTML的Table,td设置百分比宽度并且宽度不被里面的内容撑开
  3. linux 下配置 nodejs+ionic+cordova
  4. SQL pivot 基本用法 行列转换 数据透视
  5. SQL1159 Initialization error with DB2 .NET Data Provider, reason code 7(问题补充)
  6. java数据结构和算法------希尔排序
  7. (转)设置Win7防火墙规则 顺畅访问局域网
  8. VB6-AppendToLog 通过API写入日志
  9. UOJ#191. 【集训队互测2016】Unknown
  10. php Mysql 和Mysqli数据库函数整合
  11. we are happy 把空格换成 %20 剑指offer P44
  12. hdu 2710 Max Factor 数学(水题)
  13. 关于require.js的模块化开发
  14. GDAL C#版本 "安全透明方法"问题解决方案
  15. [计算机视觉]100行python实现摄像机偏移、抖动告警
  16. wifi基本原理
  17. laravel-神奇的服务容器(转)
  18. vscode+MinGW+cmake设置轻量ide
  19. mysql 开发基础系列5 运算符
  20. 案例:用Redis来存储关注关系

热门文章

  1. UI6_UIAlertContrller
  2. 利用CSS3打造一组质感细腻丝滑的按钮
  3. 在hibernate中使用c3p0数据源
  4. Codevs 2627 村村通
  5. float,double和decimal的精度问题
  6. 隐马尔科夫模型及Viterbi算法的应用
  7. 万能的SQLHelper帮助类
  8. 【Qt】QWidget、QDialog、QMainWindow的异同点【转】
  9. SQL中的模糊查询
  10. MySQL在ROW模式下通过binlog提取SQL语句