不同包客户端的处理方法 对于那种事件类型的 连接上了,连接失败了,断开连接了 bool NGP::OnConnected() {std::lock_guard<std::mutex> lock(m_PktMutex);//加锁是因为runonce应该是另一个线程m_queFunctions.push(std::bind(&NGP::Connect2ServerSuccess, this));//对于这种传递function,其实就跟函数指针差不多,return true; } bool NGP::OnRec(void* pBuffer, int nSize)//这个是专门针对包的 {date_pkt pkt;pkt.len = nSize;pkt.date = new char[nSize];memcpy(pkt.date, pBuffer, nSize);{std::lock_guard<std::mutex> lock(m_PktMutex);m_quePktQueue.push(pkt);}return true; } bool NGP::OnConnectFailed() {std::lock_guard<std::mutex> lock(m_PktMutex);m_queFunctions.push(std::bind(&NGP::Connect2ServerFailed, this));return true; } bool NGP::OnDisconnected()//对于这个为什么不加锁,不太明白 {m_queFunctions.push(std::bind(&NGP::Disconnected, this));return true; }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(0 == m_queFunctions.size())break;}}//检查数据包,一次最少处理10个命令for (int i = 0; i < 20; i++){if (m_quePktQueue.size() == 0)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(); }void NGP::ProcessDate(void* pData, int nLen) {Protocol pt = {0};if (!pt.from_buffer(pData, nLen))//解包到pt中 {return ;}auto it = m_mapPktAnalysis.find(pt.cmd_type);if(it == m_mapPktAnalysis.end()){std::wstring str = L"收到未绑定解析函数的命令: ";str += boost::lexical_cast<std::wstring>((short)pt.cmd_type);MessageBox(NULL, str.c_str(), L"收到未知命令", MB_OK);::TerminateProcess(GetCurrentProcess(), 0);//TerminateProcess终止指定进程及其所有线程。GetCurrentProcess()是个伪句柄//只要当前进程需要一个进程句柄,就可以使用这个伪句柄。该句柄可以复制,但不可继承。不必调用CloseHandle函数来关闭这个句柄 } it->second(pt.content, pt.size); } auto it = m_mapPktAnalysis.find(pt.cmd_type); 对于这种方式服务器用的很多 std::map<int, std::function<void(void* data, int len)> > m_mapPktAnalysis;一个协议,对应一个函数指针 基本都是在构造函数里面将其对应好,然后等包到的时候,根据这个map调用不同的函数 这种function的用法是在本类里面绑定好,然后根据不同协议直接调用,还有一种是直接在头文件里面定义function,看看咋回事 这种用法开始是在ngp里面,对于上面是调用本模块的函数,对于这种是调用别的模块的函数 struct FUN {std::function<> a;std::function<> b;std::function<> c; }; class A { public:A::A(){FUN fun;fun.a = std::bind();fun.b = std::bind();fun.c = std::bind();P->Init();}B* P };class B { public:FUN m_fun;//项目里面作为成员变量Init(FUN& fun)//实现调用初始化函数 {m_fun = fun;} }; 看来function的两种用法就是这样了 NGP就是根据发过来的协议(包),事件调用客户端绑定好的函数
客户端处理包方法
转载于:https://www.cnblogs.com/zzyoucan/p/4098627.html
相关文章:

0011_练习题d1
__author__ qq593 #!/usr/bin/env python #-*- coding:utf-8 -*- #使用while循环输入1 2 3 4 5 6 8 9 10 a1 while True:print(a)if(a10):breakif (a7):a1continuea1 __author__ qq593 #!/usr/bin/env python #-*- coding:utf-8 -*- #求1-100所有数的和 a1 sum00 while(a<…

iOS 仿微信灵活添加标签
iOS 仿微信灵活添加标签 原作者的github 地址 喜欢的点赞 https://github.com/DreamFlyingCow/TTTags 效果如下,iOS 13 访问私有属性 会崩溃,自己修改一下即可 TTTagView.m 文件修改如下 我的备份:https://github.com/AlexanderYeah/TTTa…

css 倒三角_倒三角结构:如何管理大型CSS项目
css 倒三角by Luuk GruijsLuuk Gruijs着 倒三角结构:如何管理大型CSS项目 (The Inverted Triangle Architecture: how to manage large CSS Projects) You’re assigned a small task to fix some little styling issues here and there. You’ve found the correc…

列举一些常见的系统系能瓶颈 Common Bottlenecks
http://www.nowamagic.net/librarys/veda/detail/2408在 Zen And The Art Of Scaling - A Koan And Epigram Approach 一文中, Russell Sullivan 提出一个很有趣的设想:一共有20种经典的瓶颈。这听起来就像只有20种基本的故事情节(20 basic s…

Zeal 离线API文档浏览器
zeal是一个windows上的开源的离线文档浏览工具,基于docset格式,可以兼容全部dash的文档。zeal没有代码片段管理的功能,只提供文档浏览功能,不过windows下的用户可算是有的用了。dash目前只提供mac上的版本,作者说有往w…

iOS scrollToItemAtIndexPath 无效的解决方案
在UITableview中放置的UICollectionView,然后设置滚动没有效果scrollToItemAtIndexPath - (void)layoutSubviews {[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.selectedIdx inSection:0] atScrollPosition:UICollectionViewScrollPositio…

机器学习编程语言_我应该选择哪种编程语言? 我应该专注于前端吗? 后端? 机器学习?...
机器学习编程语言by Preethi Kasireddy通过Preethi Kasireddy 我应该选择哪种编程语言? 我应该专注于前端吗? 后端? 机器学习? (What programming language should I pick? Should I focus on front-end? Back-end? Machine l…

spdlog源码阅读 (1): sinks
0. spdlog简单介绍 spdlog 是一个快速的 C 日志库,只包含头文件,兼容 C11。项目地址 特性: 非常快只包含头文件无需依赖第三方库支持跨平台 - Linux / Windows on 32/64 bits支持多线程可对日志文件进行循环输出可每日生成日志文件支持控制台日志输出可选…

什么样的程序员才算成熟? 让程序员认清自己的所处的阶段
http://www.nowamagic.net/librarys/veda/detail/1450程序员在经历了若干年编程工作之后,很想知道自己水平到底如何?自己是否已经成为成熟的程序员?虽然程序员会对自己有一个自我评价,但是,自己的评价和社会的评价、专…

iOS访问系统日历 添加提醒事件
1 添加隐私请求提示 Privacy - Calendars Usage Description 2 代码 #import <EventKit/EventKit.h> // 添加提醒事件 - (void)addEventWithTimeStr:(NSString *)timeStr title:(NSString *)title planId:(NSString *)planId {EKEventStore *store [[EKEventStore al…

数据分析从头学_数据新闻学入门指南:让我们从头开始构建故事
数据分析从头学by Mina Demian由Mina Demian 数据新闻学入门指南:让我们从头开始构建故事 (A Beginner’s Guide to Data Journalism: Let’s Build a Story From Scratch) This is an introductory guide on how to produce the beginnings of a piece of data jo…

Comparator 和 Comparable
Comparator 和 Comparable 比较 Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。 我们不难发现&…

朴素贝叶斯算法的python实现
朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么…

iOS 加载本地和网络gif 图片类扩展
https://github.com/AlexanderYeah/GifKuoZhan [self.meiXueImgView showGifImageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:"美" ofType:"gif"]]];

arkit与现实世界距离比_如何使用ARKit和Pusher构建实时增强现实测量应用程序
arkit与现实世界距离比by Esteban Herrera由Esteban Herrera 如何使用ARKit和Pusher构建实时增强现实测量应用程序 (How to Build a Real-Time Augmented Reality Measuring App with ARKit and Pusher) Augmented reality (AR) is all about modifying our perception of the…

Servlet 3.0 新特性概述
Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋&…

MVC、MVP、MVVM
MVC、MVP、MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用。 一、MVC(Model-View-Controller) MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作&a…

iOS 计算两个日期之间的差值
NSDateFormatter *dateFomatter [[NSDateFormatter alloc] init];dateFomatter.dateFormat "yyyy-MM-dd HH:mm";// 当前时间字符串格式NSDate *planDate [dateFomatter dateFromString:[model.PlanTime substringToIndex:16]];// 当前日历NSCalendar *calendar […

unity水管工_我是如何从30岁的管道工转变为32岁的Web开发人员的
unity水管工by Rick West由里克韦斯特(Rick West) 我是如何从30岁的管道工转变为32岁的Web开发人员的 (How I transformed from a 30-year-old plumber into a 32-year-old web developer) Friends often ask me why I decided to give up a solid, well-paying job like plum…

netty集成ssl完整参考指南(含完整源码)
虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于open的考虑。中午特地测了下netty下集成ssl的功能,关于ssl的握手过程以及jav…

呼叫中心的服务水平管理
对企业来讲,呼叫中心是企业的窗口,呼叫中心为客户提供服务,是企业提升品牌形象、建立客户忠诚度的最佳通道。因此,呼叫中心的服务水平对于企业来说意义重大,相应的服务水平管理更是企业必不可少的管理之一。 “客户至上…

iOS 数组中的模型去重
NSMutableDictionary *mutableDic [NSMutableDictionary dictionary];for (HomeRectProductModel *model in self.modelArr) {[mutableDic setValue:model forKey:model.Id];}[self.modelArr removeAllObjects];self.modelArr [[mutableDic allValues] mutableCopy];// 方法…

软件可读性和效率取舍_网络通信设计中的一些限制和取舍:摘要
软件可读性和效率取舍by Shubheksha通过Shubheksha 网络通信设计中的一些约束和折衷:摘要 (Some Constraints and Trade-offs In The Design of Network Communications: A Summary) This article distills the content presented in the paper “Some Constraints…

浅析对象访问属性的.和[]方法区别
原文链接:http://www.cnblogs.com/bigboyLin/p/4967820.html 简明版:请问js对象属性值为什么用数组也可以访问 在JavaScript中通常使用”."运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了&a…

iOS 关闭页面侧滑手势
-(void)popGestureChange:(UIViewController *)vc enable:(BOOL)enable{if ([vc.navigationController respondsToSelector:selector(interactivePopGestureRecognizer)]) {//遍历所有的手势for (UIGestureRecognizer *popGesture in vc.navigationController.interactivePopGe…

CSS与HTML结合
CSS与HTML结合的4中方式: 1、每个HTML标签都有style属性 2、当页面中有多个标签具有相同样式时,可定义style标签封装样式以复用 <style type”text/css”>css代码</style> 3、当多个页面使用相同样式时,可将样式单独封装为CSS文件…

硬件断点反跳似乎_高性能应用程序:多路复用,反跳,系统字体和其他技巧
硬件断点反跳似乎by Atila Fassina通过阿蒂拉法西纳(Atila Fassina) 高性能应用程序:多路复用,反跳,系统字体和其他技巧 (High Performance Apps: Multiplexing, Debouncing, System Fonts, and other tricks) Here are some performance ti…

jquery仿邮箱文本输入框自动加载邮箱后缀
jquery仿邮箱文本输入框自动加载邮箱后缀 在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱。这种对于增加用户体验的小例子已司空见惯。正好看到人家写的这种js功能。还挺不错,使用起来很方便,几乎不用写神呢代码。"傻…

Maven最佳实践:划分模块
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。那么,为什么要这么做呢?我们明明在开发一个项目,划…

facebook 直播_什么时候是在Facebook Live上直播的最佳时间? 我分析了5,000个Facebook帖子以找出答案。...
facebook 直播by Ofir Chakon由Ofir Chakon 什么时候是在Facebook Live上直播的最佳时间? 我分析了5,000个Facebook帖子以找出答案。 (When is the best time to stream on Facebook Live? I analyzed 5,000 Facebook posts to find out.) Streaming on Facebook …