恋恋风辰的个人博客


  • Home

  • Archives

  • Categories

  • Tags

  • Search

visual studio配置jsoncpp

Posted on 2023-05-21 | In C++

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 数据,为你的项目带来便利和高效。

Read more »

visual studio配置protobuf

Posted on 2023-05-11 | In C++

protobuf简介

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

下载protobuf安装包

官方下载地址
https://github.com/protocolbuffers/protobuf/releases

选择zip文件下载即可

Read more »

字节序处理和消息队列的控制

Posted on 2023-05-11 | In C++

字节序的问题

在计算机网络中,由于不同的计算机使用的 CPU 架构和字节顺序可能不同,因此在传输数据时需要对数据的字节序进行统一,以保证数据能够正常传输和解析。这就是网络字节序的作用。

具体来说,计算机内部存储数据的方式有两种:大端序(Big-Endian)和小端序(Little-Endian)。在大端序中,高位字节存储在低地址处,而低位字节存储在高地址处;在小端序中,高位字节存储在高地址处,而低位字节存储在低地址处。

在网络通信过程中,通常使用的是大端序。这是因为早期的网络硬件大多采用了 Motorola 处理器,而 Motorola 处理器使用的是大端序。此外,大多数网络协议规定了网络字节序必须为大端序。

因此,在进行网络编程时,需要将主机字节序转换为网络字节序,也就是将数据从本地字节序转换为大端序。可以使用诸如 htonl、htons、ntohl 和 ntohs 等函数来实现字节序转换操作。

综上所述,网络字节序的主要作用是统一不同计算机间的数据表示方式,以保证数据在网络中的正确传输和解析。

Read more »

处理粘包问题

Posted on 2023-04-23 | In C++

粘包问题

今天介绍一下如何处理粘包,粘包问题是服务器收发数据常遇到的一个现象,下面我们介绍一下粘包问题是什么,当客户端发送多个数据包给服务器时,服务器底层的tcp接收缓冲区收到的数据为粘连在一起的,如下图所示

Read more »

封装发送队列

Posted on 2023-04-22 | In C++

简介

前文介绍了通过智能指针实现伪闭包的方式延长了session的生命周期,而实际使用的服务器并不是应答式,而是全双工通信方式,服务器一直监听写事件,接收对端数据,可随时发送数据给对端,今天介绍如何封装异步的发送接口,因为多次发送时,异步的发送要保证回调触发后再次发送才能确保数据是有序的,这一点我们已经在前文异步发送函数介绍的时候提到了。

Read more »

利用C11模拟伪闭包实现连接的安全回收

Posted on 2023-04-10 | In C++

简介

之前的异步服务器为echo模式,但其存在安全隐患,就是在极端情况下客户端关闭导致触发写和读回调函数,二者都进入错误处理逻辑,进而造成二次析构的问题。
下面我们介绍通过C11智能指针构造成一个伪闭包的状态延长session的生命周期。

Read more »

简单的异步服务器demo

Posted on 2023-04-09 | In C++

简介

前文已经介绍了异步操作的api,今天写一个简单的异步echo服务器,以应答为主

Session类

Session类主要是处理客户端消息收发的会话类,为了简单起见,我们不考虑粘包问题,也不考虑支持手动调用发送的接口,只以应答的方式发送和接收固定长度(1024字节长度)的数据。

Read more »

asio异步读写操作及注意事项

Posted on 2023-04-05 | In C++

简介

本文介绍boost asio的异步读写操作及注意事项,为保证知识便于读者吸收,仅介绍api使用的代码片段,下一节再编写完整的客户端和服务器程序。
所以我们定义一个session类,这个session类表示服务器处理客户端连接的管理类

Read more »

同步读写的服务器和客户端

Posted on 2023-04-02 | In C++

简介

前面我们介绍了boost::asio同步读写的api函数,现在将前面的api串联起来,做一个能跑起来的客户端和服务器。
客户端和服务器采用阻塞的同步读写方式完成通信

客户端设计

客户端设计基本思路是根据服务器对端的ip和端口创建一个endpoint,然后创建socket连接这个endpoint,之后就可以用同步读写的方式发送和接收数据了。

Read more »

同步读写

Posted on 2023-02-13 | In C++

同步写write_some

boost::asio提供了几种同步写的api,write_some可以每次向指定的空间写入固定的字节数,如果写缓冲区满了,就只写一部分,返回写入的字节数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void  wirte_to_socket(asio::ip::tcp::socket& sock) {
std::string buf = "Hello World!";
std::size_t total_bytes_written = 0;
//循环发送
//write_some返回每次写入的字节数
//total_bytes_written是已经发送的字节数。
//每次发送buf.length()- total_bytes_written)字节数据

while (total_bytes_written != buf.length()) {
total_bytes_written += sock.write_some(
asio::buffer(buf.c_str()+total_bytes_written,
buf.length()- total_bytes_written));
}
}
Read more »
<1…111213…37>

370 posts
17 categories
21 tags
RSS
GitHub ZhiHu
© 2025 恋恋风辰 本站总访问量次 | 本站访客数人
Powered by Hexo
|
Theme — NexT.Muse v5.1.3