std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
这个容器保存了所有客户端连接的channel
Channel2* 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 = -;
{
//存在多个libevent thread同时访问m_ids、m_allChannels,得加锁
#ifdef MUL_LIBEVENT_THREAD
std::lock_guard<std::mutex> lock(m_lts_mtx);
#endif
id = m_ids->getId();
m_allChannels[id] = c2;//记录所有channel信息,一个客户端对应一个channel,id通过其中保存的bufferevent就能确定是哪个客户端
} c->m_id = id;
if(id < )
MessageBox(NULL, L"LibEvtServer::CreateChannel异常", L"重大错误", MB_OK); m_event->on_connect(id);
return c2;
}
//channelid在发送数据时,通过channelid查找容器m_allChannels,然后就能确定是哪个bufferevent
if( != bufferevent_write(c->m_bev, m_send_buffer, len+))//第一个参数就是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个线程有点扯啊
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义的更多相关文章
- 【opencv】cv::Mat转std::vector<cv::Point2d> (注意两容器中数据类型的一致性)
获取cv::Mat大小: mymat.size() 获取cv::Mat指定位置的值:需指定数据类型,且注意数据类型应与存入时的数据类型一致,否则会导致不抛出异常的数据错误 mymat.at<,i ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- std::vector介绍
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...
- (原创)动态内存管理练习 C++ std::vector<int> 模拟实现
今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...
- C++ error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“
原文地址:http://blog.csdn.net/onlyou930/article/details/5602654 圆环套圆环之迭代器 话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令 ...
- std::vector利用swap()函数进行内存的释放【转】
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...
- std::vector遍历
std::vector是我在标准库中实用最频繁的容器.总结一下在遍历和创建vector时需要注意的一些地方. 在不考虑线程安全问题的前提下,在C++11中有五种遍历方式. 方式一 for (size_ ...
随机推荐
- PHP系统函数
(一)字符串处理函数 Chr函数 作用:根据ASCII码返回相应的字符. 语法:string chr(int ascii): Chop函数 作用:去除字符串中连续空格和空白行. 语法:string c ...
- Linux安全运维日志排查几个 tips
运维日志排查记录 前言 记录一些排查常见日志的命令,方法wiki,欢迎补充(Markdown 语法). 常用命令 查找关键词并统计行数 cat 2015_7_25_test_access.log | ...
- 类似桌面背景壁纸随手指滑动--第三方开源--BackgroundViewPager
Android BackgroundViewPager在github上的项目主页是:https://github.com/MoshDev/BackgroundViewPager 下载下来即可运行
- 管理员 修改MySQL 5.7.9 新版本的root密码方法以及一些新变化整理
MySQL 5.7版本开始,增强密码验证机制,网上说安装的时候会在/root/.mysql_secret 文件中生成默认密码,这一点自 5.7.6版本以后也去掉了. 针对如果生成默认密码,网上有一个 ...
- adb 修改system文件
1. $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备. 2. $ adb shell 3. $ su // 切换到 ...
- [转]给C++初学者的50个忠告
1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Prog ...
- 关于js中立即执行的匿名函数写法
/*最流行的写法*/ (function() { alert("run!") })(); /* !号可以有1~正无穷个,所以这一种就可以衍生无数种方式 */ !!!(functio ...
- 部署到iis后,发现无法加载运行CSS文件
解决方法: 打开或关闭window功能中的Internet信息服务里的万维网服务=>常见HTTP功能=>静态内容
- MVC中Model,不仅仅只是数据的传递者
在Model使用的时候很多人回向以前写三层架构一样使用它,将Model作为数据的传递者. 比如常见的写法 public int Id { get; set; } public int RoleId { ...
- ADOMD连接SSAS和Mondrian,rex的终结者
前传 公司使用Mondrian作为OLAP服务器,于是,不得不适用Java开源的Rex进行客户端连接,用了一段时间,实在无法忍受rex的笨拙,于是乎,一直希望有一个工具能够连接替代它. 周末闲来无事, ...