NGP处理包
NGP处理部分(主要就是这个RunOnce函数,客户单肯定是开个线程取调用这个RunOnce的)
void NGP::RunOnce()
{
m_spTimerFac->driveTimer();//客户端心跳包驱动 //先检查一下其他命令
if(m_queFunctions.size())
{
for (;;)
{
std::function<void()> fun;
{
std::lock_guard<std::mutex> lock(m_PktMutex);
fun = m_queFunctions.front();
}
fun();
{
std::lock_guard<std::mutex> lock(m_PktMutex);
m_queFunctions.pop();
}
if( == m_queFunctions.size())
break;
}
}
//检查数据包,一次最少处理10个命令
for (int i = ; i < ; i++)
{
if (m_quePktQueue.size() == )
break; date_pkt pkt;
{
std::lock_guard<std::mutex> lock(m_PktMutex);
pkt = m_quePktQueue.front();
m_quePktQueue.pop();
}
ProcessDate(pkt.date, pkt.len);
delete[] pkt.date;
}
//_TcpLink->run_one();
} 连接事件就这几个
OnConnectFailed--->直接连接失败了,在bufferevent_socket_connect,这个就相当于socket里面的connect
OnConnected--->连接成功了
OnDisconnected--->这个是服务端突然蹦了,这样客户端也能收到通知 这些事件相应的绑定函数放到m_queFunctions队列中,runonce可以直接调用传递进来的绑定函数
bool NGP::OnRec(void* pBuffer, int nSize)
{
date_pkt pkt;
pkt.len = nSize;
pkt.date = new char[nSize];//注意在runonce中释放内存
memcpy(pkt.date, pBuffer, nSize);
{
std::lock_guard<std::mutex> lock(m_PktMutex);
m_quePktQueue.push(pkt);
}
return true;
}
对于接收的包放到m_quePktQueue,在初始化的时候会创建一个map,key是协议,value是绑定好的函数对象,在runonce中
使用protocol来解析发送过来的包,这个包是符合协议的,那么第一个字节就是协议,后面是长度和内容,然后根据协议查找map,调用绑定好的函数。
根据协议类型调用绑定函数这种方法在服务器很多。
对于协议解析和中间的线程加锁理解不是太好
NGP处理包的更多相关文章
- 一个包的libevent流程
//一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { Send ...
- Npm包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下Nu ...
- android http 抓包
有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目 3.安装依赖包(进入到命令行) # 安装依赖包 $ ...
- 关于Visual Studio 未能加载各种Package包的解决方案
问题: 打开Visual Studio 的时候,总提示未能加载相应的Package包,有时候还无法打开项目,各种提示 解决方案: 进入用户目录 C:\Users\用户名\AppData\Local\M ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
随机推荐
- 任务管理界面添加显示RAM信息
显示RAM信息的核心代码是大蛋的,我只不过是整理下教程而已! 大蛋应该不会介意的吧,首先你需要apktool和SystemUI.apk,framework-res.apk 然后开始加载框架和反编译.. ...
- angularjs2 学习笔记(四) 路由
angular2路由是管理angular2应用内部导航的一个重要内容,在angular应用中,很多的组件是通过组合完成一个复杂的应用,不可避免的是我们常会在视图间切换,那么这是就需要使用路由来管理视图 ...
- JavaScrip拖动动画中的常见BUG
经常我们在用JS辛苦写完一个拖动效果之后 ,发现有各种无法用JS解决的BUG.比如拖动时DOM元素中的内容会变蓝,鼠标的指示会变为一个小+号,或disable的样式,通常这种情况一发生,我们的拖动效果 ...
- 网络开发库从libuv说到epoll
引言 这篇博文可能有点水,主要将自己libuv的学习过程和理解. 简单谈方法. 有点杂. 那我们开始吧. 首先介绍 githup . 这个工具特别好用. 代码托管. 如果不FQ可能有点卡. 但是应该试 ...
- linux 病毒 sfewfesfs
由于昨天在内网服务器A不小心rm -fr / ,导致服务器A完蛋,重装系统后,不知道啥原因,局域网瘫痪不能上网,最后发现内网服务器A的一个进程sfewfesfs cpu 300%.路由器被网络阻塞啦. ...
- 使用dom4j技术对xml文件的基本操作
1.pojo类:Notice package com.green.notice.storage; import java.util.ArrayList; import java.util.List; ...
- iTiTa再次回归,这一年我们都在干什么?
转眼一看这都2013年了,距离我们上一次发布篮球游戏已经一年多了. 从去年到今年我们几乎只做了一件事——<二战前线>! 这一年的时间从最简单的游戏游戏雏形到今天一个具备商业能力的游戏,一路 ...
- Redis 客户端配置及示例
一.redis自定义配置节点 <configSections> <section name ="RedisConfig" type="Amy.Toolk ...
- 在线演示平台 | Highcharts中文网 (曲线图、区域图、3D图等等)
http://www.hcharts.cn/ 在线演示平台 | Highcharts中文网
- [转]vim常用命令
[转]vim常用命令 http://www.cnblogs.com/sunyubo/archive/2010/01/06/2282198.html http://blog.csdn.net/wooin ...