C++->network设计

现行开发的软件中,基本没有啥是不联网的。连一个小小的游戏,也要联网,去下载点广告什么的。那么网络层的是不是可以有很多东西可以重用的呢?

本人之前在一个游戏公司做服务器端开发。有一个网络架构是这样设计的。

网络使用了IO复用模型select。当然,对于现在的服务器,可以使用epoll代替。

一个Opcodes类,类成员都是静态的常量,用于表示与服务器通信的操作码。我们称它们为协议号。对于每一个操作,都会有一个协议号对应。比如客户端登录,客户端发给服务器进验证,使用一个CSLOGIN的常量表示。服务器验证后,将结果返回,可以使用一个SCLOGIN的常量表示。等等。

一个Optable类。这个类使用一std::map来记录每一个协议号的操作。map中的first value是协议号,second value是对应协议的处理逻辑回调函数。这个类应该设计成单例的。在main函数中,进行网络通信之前应该将这个单例中的map设计好,即将所有的协议号和回调函数insert到map中。这里还有一点要求,就是回调函数的声明必须是一样 ,不然map就定义不了。所以,回调函数可以设计成void (*)(unsigned
char*)这样结构。因为收到的消息也是字节流。先从流中解析出包的长度,再解析出该长度的消息。当然,为了方便处理,还可以封装多一层函数,这个函数的功能是这样的:我们定义协议的时候,会要求将什么参数传到网络中去,比如将用户名和密码发给服务器,那么就会参数就会是这样string name, string password。这样就可以在回调函数中调用相应的这个函数,而这个函数应该由子类去重写其对应的业务逻辑。那这些业务逻辑应该放在哪里呢?下面讨论。

设计一个Receiver类,让要进行接收消息的端去继承这个类。比如,服务器可以有一个用于监听连接的类,然后这个类的函数监听到一个连接,然后将这个连接new一个新的对象,而这个对象所对应的类应该继承Receiver类,这样就可以去重写上面所说的方法了。

整理一下逻辑(以服务器为例):

  1. 服务器收到包,发给对应的处理对象。
  2. 解析出协议号。
  3. 在optable中根据协议号找出处理函数。
  4. 处理函数调用重写的业务逻辑函数进行处理。

也就是说,这个网络层是有东西可以封装的。如果封闭了服务器(客户端),optable, receiver等类,那么,以后要用这个网络层,只要在opcodes中加入协议号。子类化receiver类,就能进行处理这些逻辑。

以上是网络层的设计思想。也可以看成是一个概要设计,接下来我会对这个设计进行实现。实现完成后,将会加入我的git中。

当然,在实际使用中,已经有了很多网络架构,如ICE,ACE等,可以使用这些架构使项目的速度快很多。但是,自己封装的网络层可以进行自己定制,实现更高效的网络架构。见仁见智吧。

时间: 2024-08-01 10:42:46

C++->network设计的相关文章

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

[Android] Volley源码分析(一)体系结构

Volley:google出的一个用于异步处理的框架.由于本身的易用性和良好的api,使得它能得以广泛的应用.我还是一如既往从源码的方向上来把控它.我们先通过一段简单的代码来了解Volley RequestQueue queue = Volley.newRequestQueue(this); ImageRequest imagerequest = new ImageRequest(url, new Response.Listener<Bitmap>(){ @Override public vo

R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列

就是想保存下来,没有其他用意 原博文:http://blog.csdn.net/qq_26898461/article/details/53467968 3. 空间定位与检测 参考信息<基于深度学习的目标检测研究进展> 3.1 计算机视觉任务 3.2 传统目标检测方法 传统目标检测流程: 1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高) 2)特征提取(SIFT.HOG等:形态多样性.光照变化多样性.背景多样性使得特征鲁棒性差) 3)分类器(主要

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

web架构设计经验分享(转)

本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化一的架构,希望设计出具有无比扩展性,能适应一切需求的增加架构,web开发领

ZOJ1372 POJ 1287 Networking 网络设计 Kruskal算法

题目链接:ZOJ1372 POJ 1287 Networking 网络设计 Networking Time Limit: 2 Seconds      Memory Limit: 65536 KB You are assigned to design network connections between certain points in a wide area. You are given a set of points in the area, and a set of possible

HT图形组件设计之道(一)

HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方式.正如Hightopo官网所表达的我们希望提供:Everything you need to create cutting-edge 2D and 3D visualization. 这个愿景从功能上是个相当长的战线,从设计架构上也是极具挑战性的,事实上HT团队是很保守的,我们从不贪多图大,仅仅做我们感觉自己能得更好,能给用户综合体验更佳的功能,在这样理念驱动下我们慢慢形成了这种愿景,慢慢实现了几个有意义