博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
阅读量:5316 次
发布时间:2019-06-14

本文共 1437 字,大约阅读时间需要 4 分钟。

std::vector
m_allChannels;容器,以及如何根据channelid的意义这个容器保存了所有客户端连接的channelChannel2* LibEvtServer::CreateChannel(bufferevent* be){ auto c2 = new Channel2; c2->ser = this; auto c = new Channel(be);//这个be比较重要,be是基于socket的bufferevent,包含socket信息以及发送和接收缓冲区 c2->channel = c; c->m_event = m_event;//Libevent事件回调指针 int id = -1; { //存在多个libevent thread同时访问m_ids、m_allChannels,得加锁#ifdef MUL_LIBEVENT_THREAD std::lock_guard
lock(m_lts_mtx);#endif id = m_ids->getId(); m_allChannels[id] = c2;//记录所有channel信息,一个客户端对应一个channel,id通过其中保存的bufferevent就能确定是哪个客户端 } c->m_id = id; if(id < 0) MessageBox(NULL, L"LibEvtServer::CreateChannel异常", L"重大错误", MB_OK); m_event->on_connect(id); return c2;}//channelid在发送数据时,通过channelid查找容器m_allChannels,然后就能确定是哪个buffereventif(0 != bufferevent_write(c->m_bev, m_send_buffer, len+4))//第一个参数就是bufferevent,其中能确定socket,通过socket就能确定是哪个客户端有一次同事吃饭的认为是一个客户端一个线程,其实不是这样的,只能这样说一个客户端对应一个bufferevent,在这些bufferevent又是通过base进行轮转的在内部是select模式进行循环检查的,哪个socket可读,可写,有错误,都是知道的然后调用不同的函数,auto bev = bufferevent_socket_new(plt->thread_base, item.fd, BEV_OPT_THREADSAFE);Channel2* c2 = CreateChannel(bev);//设置接收、状态改变 回调函数bufferevent_setcb(bev, conn_readcb, NULL, conn_eventcb, c2);//此时已经将c2传递进去了,然后就能知道id,上层也是通过id进行辨别哪个客户端在发送数据时也通过channelid,这边也知道哪个客户端,其实开线程不现实,在服务器上开6000个线程有点扯啊

 

转载于:https://www.cnblogs.com/zzyoucan/p/4101301.html

你可能感兴趣的文章
一位面试者提到直接调用vuex中mutations方法
查看>>
安装JDK
查看>>
semantic ui要装什么才能使用
查看>>
【原】Python基础-函数
查看>>
什么是SG?+SG模板
查看>>
四叶草社交平台——十天冲刺(10)
查看>>
如何使用jquery刷新当前页面
查看>>
[学习笔记]状压dp
查看>>
cocos2d-x 3.0rc2中读取sqlite文件
查看>>
Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler)分析
查看>>
海量数据处理面试题集锦
查看>>
【设计模式】命令模式
查看>>
pyinstaller---将py文件打包成exe
查看>>
readonly和const的区别
查看>>
VS 代码行数统计
查看>>
SSM框架搭建(四) springmvc和mybatis的配置
查看>>
UVa 11346 - Probability
查看>>
python数据类型之间的转换
查看>>
微软职位内部推荐-SDEII
查看>>
微软职位内部推荐-SENIOR SOFTWARE ENGINEER
查看>>