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_ ...
随机推荐
- 微软必应·英雄会第三届在线编程大赛:几个bing?
发布公司:微软亚太研发集团 有 效 期:2013-12-31至2014-02-01 难 度 等 级: 答 题 时 长:120分钟 编程语言要求:C C++ Java C# 悬赏详情 一等奖 : 价值2 ...
- public void onItemClick(AdapterView arg0, View view, int position,long arg3)详解【整理自网络】
参考自: http://blog.csdn.net/zwq1457/article/details/8282717 http://blog.iamzsx.me/show.html?id=147001 ...
- Python之Redis操作
1.安装驱动 输入命令:pip install redis 2.直接使用驱动 import redis r = redis.StrictRedis(host='127.0.0.1', port=637 ...
- android开发系列之消息机制
最近接触到一个比较有挑战性的项目,我发现里面使用大量的消息机制,现在这篇博客我想具体分析一下:android里面的消息到底是什么东西,消息机制到底有什么好处呢? 其实说到android消息机制,我们可 ...
- golang的goroutine与channel
Golang的goroutine是非抢占式的, 令人相当蛋疼! 有痛不能呻吟...只能配合channel在各goroutine之间传递信号来实现抢占式, 而这形成了golang最灵活与最具性能的核心. ...
- require.js的用法
我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文 ...
- MVC4.0 使用Form认证,自定义登录页面路径Account/Login
使用MVC4.0的时候,一般遇到会员登录.注册功能,我们都会使用Form认证,给需要身份验证的Action进行授权(需要登录后才能访问的Action添加[Authorize]属性标签),登录.注册的时 ...
- MYSQL procedure
没怎么接触过mysql procedure,今天建个calendar表还磨磨唧唧的,记录一下: CREATE PROCEDURE `new_procedure` (start_date DATA,en ...
- Mysql去除重复
常用的有两种方法,第一种就是select distinct name from table.但是有时候我们要返回多个字段时就用第二种方法select *, count(distinct name) f ...
- 51nod 1109 01组成的N的倍数
用01 组成 N的最小倍数 这个BFS搜索就好. 类似这道: ZOJ Problem Set - 1530 每次 要么是0 要么是1, 记入余数,和前驱. #include<bits/stdc ...