字节序和消息队列控制

176 阅读4分钟

前序:io_context对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的 ,都会向它注册类似读写事件。底层会轮寻所有事件(io对象的构造函数中都需要传入一个io service对象)。在同步事件中会使用一个默认的。参考链接blog.csdn.net/qq_41172631…

asio::io_context io_context;
asio::ip::tcp::socket socket(io_context)

image.png

1.字节序问题

由于不同的计算机使用的 CPU 架构和字节顺序可能不同,因此在传输数据时需要对数据的字节序进行统一,以保证数据能够正常传输和解析。这就是网络字节序的作用。
具体来说,计算机内部存储数据的方式有两种:大端序(Big-Endian)和小端序(Little-Endian)。在大端序中,高位字节存储在低地址处,而低位字节存储在高地址处;在小端序中,高位字节存储在高地址处,而低位字节存储在低地址处。
在网络通信过程中,通常使用的是大端序。这是因为早期的网络硬件大多采用了 Motorola 处理器,而 Motorola 处理器使用的是大端序。此外,大多数网络协议规定了网络字节序必须为大端序。
因此,在进行网络编程时,需要将主机字节序转换为网络字节序,也就是将数据从本地字节序转换为大端序。可以使用诸如 htonl、htons、ntohl 和 ntohs 等函数来实现字节序转换操作。
综上所述,网络字节序的主要作用是统一不同计算机间的数据表示方式,以保证数据在网络中的正确传输和解析。

引入:1. // 判断当前系统的字节序是大端序还是小端序

  bool is_big_endian() {`
 int num = 1;`
  if (*(char*)&num == 1) {`
  // 当前系统为小端序`
  return false;`
  } else {`
 // 当前系统为大端序`
  return true;`
  }`
 }`
```该函数通过创建一个整型变量 num,并将其最低位设置为 1,然后通过指针强制转换成字符指针,判断第一个字节是否为 1 来判断当前系统的字节序。

2.服务器使用网络字节序:为保证字节序一致性,网络传输使用网络字节序,也就是大端模式。
在 boost::asio 库中,可以使用 boost::asio::detail::socket_ops::host_to_network_long() 和 boost::asio::detail::socket_ops::host_to_network_short() 函数将主机字节序转换为网络字节序。

2.发送时我们会将发送的消息放入队列里以保证发送的时序性,每个session都有一个发送队列,因为有的时候发送的频率过高会导致队列增大,所以要对队列的大小做限制,当队列大于指定数量的长度时,就丢弃要发送的数据包,以保证消息的快速收发。

3.protobuf配置使用

简介:Protocol Buffers(简称 Protobuf)是一种轻便高效的序列化数据结构的协议,由 Google 开发。它可以用于将结构化数据序列化到二进制格式,并广泛用于数据存储、通信协议、配置文件等领域。 我们的逻辑是有类等抽象数据构成的,而tcp是面向字节流的,我们需要将类结构序列化为字符串来传输。

恋恋风辰官方博客 (llfc.club) 注意:需要在链接器添加:PROTOBUF_USE_DLLS;在代码生成运行库选项改为:多线程调试 DLL (/MDd);生成pb文件: protoc --cpp_out=. ./msg.proto

4.jsoncpp配置:

简介:jsoncpp 是一个 C++ JSON 库,它提供了将 JSON 数据解析为 C++ 对象、将 C++ 对象序列化为 JSON 数据的功能。它支持所有主流操作系统(包括 Windows、Linux、Mac OS X 等),并且可以与常见编译器(包括 Visual Studio、GCC 等)兼容。

jsoncpp 库是以源代码的形式发布的,因此使用者需要自己构建和链接库文件。该库文件不依赖于第三方库,只需包含头文件即可使用。

jsoncpp 库的特点包括:

  1. 轻量级:JSON 解析器和序列化器都非常快速,不会占用太多的 CPU 和内存资源;
  2. 易于使用:提供简单的 API,易于理解和使用;
  3. 可靠性高:经过广泛测试,已被许多企业和开发者用于生产环境中;
  4. 开源免费:遵循 MIT 许可证发布,使用和修改均免费。

总之,jsoncpp 是一款优秀的 C++ JSON 库,它可以帮助你轻松地处理 JSON 数据,为你的项目带来便利和高效。借鉴:恋恋风辰官方博客 (llfc.club)