一个用于协议开发的 C++ 框架 【已翻译100%】

简介:

前言

欢迎!这里有一个网络基础类的抽象封装,开发者可以构建网络协议的具体实现。它以C++库的形式提供了一套类集,任何人都可以使用它构建程序。

这些抽象的主要好处是便于将这些协议实现集成到程序中我们不想浪费时间实现期望的协议或者使用一个第三方实现的地方。

此外,这些抽象便于员工协同工作,复用他们的工作并且提供其它实现的接口。例如,一些开发者可以致力协议的实现,另一些则聚集于协议测试工具。
目标

解决当前所有问题和满足所有需求的抽象层级是最好的,可以在更改之前保持长时间的有效性。此外,它应该符合人类思维并且足够精确。这意味着所有的差异都要集中到一个模型中。这些抽象应该在开发者看到他们的时候感到自然顺畅,并且能够在整个实现过程中指导他们如何实现协议。

下面这些目标是要告知协议开发者的。从程度开发的观点来看,抽象层级应该便于协议实现在应用中集成以便于调用,更重要的是将线路通信协议置于两个通信进程的首要位置。例如,增加传输安全验证应该通过少量的线路通信协议调用实现。如果应用程序需要传输海量数据并且我们发现其中一个通信端使用了压缩数据协议,它应该在高层协议实现数据的解压缩。下面的图表演示了一个例子,当网络层数据进入传输层TLS时,需要将IP数据包解码成传输层的有效负荷Websocket帧,然后再解压成离散的字节缓冲单元,最后序列化成应用程序可以使用的对象消息结构。当应用程序传递消息时,先序列化成字节缓冲单元,然后压缩并转换成Websocket帧,编码并发送给TCP。

image

实现

  • 在规划协议的抽象层次之前,需要一个人浏览很多协议实现并且推论出公共的要求。从我的经验来看,我会将了解到的重要要求写在一张清单上。对于别人赞扬或者批评的评论我都会表示赞赏。
  • 编码和序列化:协议尽量使数据的表示方式透明。在一个协议栈的层级上,上层协议将会按照字节处理收到的数据。如果不是商用协议就不要将数据序列化成特殊的结构,或者期望使用一种特殊类型来进行序列化。协议将会将字节编码成另一种字节,也会将字节解码成另一种字节。我认为任何协议实现都应该超越这个层次,作一些额外的数据填充使得协议实现复用和同一层次协议聚集变得困难等等。
  • 许多协议需要一种通信路径存储每一连接数据。编码和解码可能依赖于数据的演化。(在协议框架中,这种类称为 ProtocolContext类)。
  • 当收到数据时,每一个协议层都试图解码内容并传递到上一层协议中。这个过程会不断重复直到没有协议层可以将数据推送到上层时。这也意味着每一层需要数据缓冲区和更多的读操作。
  • 当收到数据时,它不应该被直接送到缓冲区,一些协议将会对内容进行转换,所以我们应该在预先读到的数据中没有增加新的内容并且尚未提交给上一层时提供转换操作。
  • 当协议解码数据时,它可能返回解码后的数据,也可能将数据交由对等的应用程序处理而不介入数据解码。这种数据被称为控制信息,它将会满足许多协议的需要。最简单的例子,当一层协议需要送 heart beat信息时其它的协议必须予以回复。
  • 抽象应该提供一种方式便于协议层进入初始化阶段,在这期间,上层协议和应用层不应当发送任何数据直到初始化完成。例如,如果在Websocket和 TLS层,当一个连接建立时,我们需要TLS层完成握手操作,然后再给Websocke发送OK信息并开始交换数据。应用程序代码不能开始任何操作直到Websocke完成握手操作。

用例:

如果你想浏览一个完整的框架工作用例,你可以浏览CodePlex上的 Push Framework repository 中的Websocket solution。

http://pushframework.codeplex.com/SourceControl/latest(查找 version 3.0,打开WebsocketServer 目录)。
WebsocketProtocol 是一个使用ProtocolFramework抽象实现Websocket Protocol (RFC 6455) 的库文件。DemoServer是一个仅打印出它接收到数据的示例服务器。多亏那些在Autobahn Websocket测试站点的不知名的客户端,它将WebsocketProtocol视为协议而我用它使协议实现变得健壮。
感谢ProtocolFramework,我可以轻易在不同的协议之间转换,聚集同层协议一起工作,甚至使用多端口监听不同类型的客户端并理解特殊的协议栈。

MyServer theServer;
WebsocketProtocol webProtocol;

//Create a listening port using unsecured port.
ListenerOptions lOptions;
lOptions.pProtocol = &webProtocol;
theServer.createListener(10010, &lOptions);

//Create a second listening port, for secured clients:
SSLProtocol sslProtocol;
if (!sslProtocol.initializeAsServer("E:\\certificates\\server.crt",
                                    "E:\\certificates\\server.key",
                                     "pass"))
{
    cout << "ssl initialization failed"<< endl;
    return -1;
}
WebsocketProtocol webProtocol2;
webProtocol2.addLowerProtocolLayer(&sslProtocol);
ListenerOptions lOptions2;
lOptions2.pProtocol = &webProtocol2;
theServer.createListener(10010, &lOptions2);
theServer.start(true)
相关文章
|
数据可视化 关系型数据库 MySQL
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
808 82
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
800 14
|
IDE 开发工具 C语言
C++一分钟之-嵌入式编程与裸机开发
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解C++在嵌入式编程与裸机开发中的应用,提高开发效率和代码质量。
475 13
WK
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
761 5
WK
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
1004 1
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
546 7
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
674 1
WK
|
C++ 开发者 iOS开发
C++跨平台框架
C++跨平台框架使开发者能够编写一次代码,在多个操作系统和硬件平台上运行,提高开发效率和软件可扩展性。常见的框架包括Qt、wxWidgets、SDL、JUCE等,它们各自具有丰富的功能和特点,适用于不同的应用场景。选择框架时需考虑目标平台、功能需求、学习曲线和社区支持等因素。
WK
766 0
WK
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
551 0