使用Boost.Asio编写TCP通信程序框架(一)

基于Boost.Asio库编写TCP通信程序框架: 我们首先需要明确几个关键点:节点间如何建立连接、消息如何传输、以及如何处理网络事件。以下是一个简化的设计方案:

1. 设计目标

  • 可扩展性:系统应该能够轻松地添加或移除节点。
  • 容错性:系统应能处理节点故障并自动恢复连接。
  • 安全性:数据在传输过程中应得到保护。

2. 技术栈

  • Boost.Asio:用于异步网络编程。
  • C++17 或更高版本:利用现代C++特性提高代码质量和效率。

3. 系统架构

  • 服务器端:负责监听连接请求,并与客户端进行通信。
  • 客户端:主动发起连接,向服务器发送数据和接收响应。

4. 主要组件

4.1 连接管理器 (Connection Manager)
  • 负责维护所有活动连接的状态。
  • 实现连接的建立、断开和重连逻辑。
4.2 消息处理器 (Message Processor)
  • 解析接收到的数据,处理并生成响应。
  • 可以是状态机,根据不同的消息类型执行不同的操作。
4.3 安全层 (Security Layer)
  • 可选组件,实现数据加密和解密,如使用TLS/SSL

5. 示例代码结构

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <memory>
#include <string>namespace asio = boost::asio;class ConnectionManager {
public:void start(const std::string& address, unsigned short port) {acceptor_.open(asio::ip::tcp::v4());acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true));acceptor_.bind(asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port));acceptor_.listen();start_accept();}private:void start_accept() {auto session = std::make_shared<Session>(io_context_);acceptor_.async_accept(session->socket(),[this, session](std::error_code ec) {if (!ec) {session->start();}start_accept(); // Accept another connection.});}asio::io_context io_context_;asio::ip::tcp::acceptor acceptor_;
};class Session : public std::enable_shared_from_this<Session> {
public:Session(asio::io_context& io_context) : socket_(io_context) {}void start() {read_header();}private:void read_header() {asio::async_read(socket_,asio::buffer(read_msg_.data(), Message::header_length),boost::bind(&Session::handle_read_header, shared_from_this(),asio::placeholders::error,asio::placeholders::bytes_transferred));}void handle_read_header(const std::error_code& error,size_t bytes_transferred) {if (!error && bytes_transferred == Message::header_length) {read_msg_.decode_header();read_body();} else {socket_.close();}}void read_body() {asio::async_read(socket_,asio::buffer(read_msg_.body(), read_msg_.body_length()),boost::bind(&Session::handle_read_body, shared_from_this(),asio::placeholders::error,asio::placeholders::bytes_transferred));}void handle_read_body(const std::error_code& error,size_t bytes_transferred) {if (!error && bytes_transferred == read_msg_.body_length()) {message_processor_.process(read_msg_);write_msg_.encode_header();write_msg_.encode_body();write_message();} else {socket_.close();}}void write_message() {asio::async_write(socket_,asio::buffer(write_msg_.data(), write_msg_.length()),boost::bind(&Session::handle_write, shared_from_this(),asio::placeholders::error,asio::placeholders::bytes_transferred));}void handle_write(const std::error_code& error,size_t bytes_transferred) {if (!error && bytes_transferred == write_msg_.length()) {read_header();} else {socket_.close();}}asio::ip::tcp::socket socket_;Message read_msg_;Message write_msg_;MessageProcessor message_processor_;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机嵌入式开发:1、STC89C52环境配置到点亮LED

STC89C52环境配置到点亮LED 1 环境配置1.1 硬件环境1.2 编译环境1.3 烧录环境 2 工程配置2.1 工程框架2.2 工程创建2.3 参数配置 3 点亮一个LED3.1 原理图解读3.2 代码配置3.3 演示 4 总结 1 环境配置 1.1 硬件环境 硬件环境采用“华晴电子”的MINIEL-89C开发板&#xff0c;这…

服务发现与注册:Eureka与Consul

在微服务架构中&#xff0c;服务发现与注册是一个非常重要的部分。通过服务发现机制&#xff0c;微服务能够相互找到并进行通信&#xff0c;而不需要了解彼此的具体地址。本文将详细介绍两种主流的服务发现与注册框架&#xff1a;Eureka和Consul&#xff0c;并提供相应的代码示…

elasticSearch快速了解

elasticSearch&#xff1a;经常用于搜索引擎&#xff0c;我们用的百度搜索和github上的搜索都是用的搜索引擎&#xff0c;它是对输入内容进行分析&#xff0c;然后查询&#xff0c;不像数据库模糊搜索的like一样必须含用你输入的全部内容。 elasticSearch优势&#xff1a;支持…

一文解决:你与该网站的连接不是私密连接,存在安全隐患

访问网页时&#xff0c;是不是会经常遇到网站不是私密连接的提示&#xff1f;当浏览器提示某个网页不安全时&#xff0c;这通常是因为网页使用的是非加密的HTTP协议&#xff0c;或者其HTTPS协议的SSL/TLS证书存在问题。 通常遇到这类网站时要注意&#xff0c;一来是网站未与证书…

`THREE.Line` 是 Three.js 中用于创建线段的类。

demo案例 THREE.Line 是 Three.js 中用于创建线段的类。以下是 THREE.Line 的详细说明&#xff0c;包括构造函数参数、输出、方法和属性。 构造函数 new THREE.Line(geometry, material, mode) geometry (THREE.BufferGeometry 或 THREE.Geometry): 定义线段的几何体。mater…

概率解码:SKlearn中模型的概率预测指南

概率解码&#xff1a;SKlearn中模型的概率预测指南 在机器学习中&#xff0c;概率预测是一种评估样本属于某个类别可能性的方法。这种预测方式不仅提供了分类结果&#xff0c;还给出了预测的置信度。Scikit-learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中…

[图解]SysML和EA建模住宅安全系统-12-内部块图

1 00:00:00,580 --> 00:00:02,770 接下来我们来画流了 2 00:00:03,100 --> 00:00:05,050 首先第一个是站点状态 3 00:00:05,140 --> 00:00:08,130 从这里到这里&#xff0c;我们画一个过来 4 00:00:10,290 --> 00:00:11,890 这里流到这里 5 00:00:11,900 -->…

汉中茗茶小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;茶叶管理&#xff0c;论坛管理&#xff0c;公告管理&#xff0c;茗茶历史管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;茗茶信息&#xf…

探索 WebKit 的分享新境界:Web Share Target API 的深度解析

探索 WebKit 的分享新境界&#xff1a;Web Share Target API 的深度解析 在移动为先的网络世界中&#xff0c;Web Share Target API 为 Web 应用提供了一种简单而强大的方式&#xff0c;允许它们成为分享目标&#xff0c;接收来自其他应用或 Web 应用的内容。作为众多现代浏览…

mac怎么压缩pdf文件大小,mac压缩pdf文件大小不改变清晰度

在数字化时代&#xff0c;pdf格式因其良好的兼容性和稳定性&#xff0c;成为了文档分享和传输的首选。然而&#xff0c;随着文件内容的丰富&#xff0c;pdf文件的体积也越来越大&#xff0c;给存储和传输带来了不小的困扰。本文将揭秘几种简单有效的pdf文件压缩方法&#xff0c…

如何优化 PostgreSQL 中对于自关联表的查询?

文章目录 一、理解自关联表查询二、分析性能问题的可能原因&#xff08;一&#xff09;缺少合适的索引&#xff08;二&#xff09;大量数据的笛卡尔积&#xff08;三&#xff09;复杂的查询逻辑 三、优化策略及解决方案&#xff08;一&#xff09;创建合适的索引&#xff08;二…

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点…

第二周:李宏毅机器学习笔记

第二周学习周报 摘要Abstract一、深度学习1.Backpropagation&#xff08;反向传播&#xff09;1.1 链式法则1.2 Forward pass&#xff08;前向传播&#xff09;1.3 Backward pass&#xff08;向后传播&#xff09;1.4 总结 2. Regression&#xff08;神奇宝贝案例&#xff09;2…

Redis常用命令——Set、Zset篇

文章目录 一、Set相关命令操作 SADD SMEMBERS SISMEMBER SCARD SPOP SMOVE SREM SINTER 与 SINTERSTORE SUNION 与 SUNIONSTORE SDIFF 与 SDIFFSTORE Set命令小结 二、Zset 相关命令操作 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZPOPMAX BZPOPMAX ZPOPMIN 与 BZPOPMIN ZRANK 与 …

MySQL事务隔离

MySQL事务隔离 前言锁共享锁&#xff08;Shared Lock&#xff09;排他锁&#xff08;Exclusive Lock&#xff09;行级锁&#xff08;Row-Level Lock&#xff09;表级锁&#xff08;Table-Level Lock&#xff09;快照读和当前读查看锁 事务事务的四个特性事务的并发问题事务的隔…

java中的jvm分为几种,各自的优缺点是什么,进来看看,必能凿壁偷光,眼前一亮

前言 Java虚拟机&#xff08;Java Virtual Machine, JVM&#xff09;是运行Java应用程序的核心组件&#xff0c;负责将Java字节码解释或编译为机器代码。不同的JVM实现提供了多种特性和性能优化&#xff0c;满足不同应用场景的需求。以下是一些主要的JVM实现及其各自的优缺点 …

手写深拷贝(Deep Copy)和浅拷贝(Shallow Copy)

在编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两个重要的概念&#xff0c;特别是在处理对象或数组时。它们的主要区别在于如何处理对象或数组中的引用类型&#xff08;如对象、数组等&#xff09;。 浅拷贝&am…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程&#xff0c;程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时&#xff0c;列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

2万字长文详解Ambari面试题及参考答案

目录 Ambari的主要功能是什么? Ambari如何与Hadoop生态系统中的其他组件交互? 解释Ambari中“蓝本”(Blueprints)的概念。 如何使用Ambari进行集群的监控和管理? Ambari支持哪些Hadoop版本? 在Ambari中,如何查看和管理服务日志? Ambari的安装过程涉及哪些主要步骤…

WEB开发-HTML页面更新部分内容

1 需求 2 接口 3 示例 在HTML页面中&#xff0c;如果你想要改变部分内容而不是整个页面&#xff0c;有几种方法可以实现这一目标&#xff0c;主要包括&#xff1a; JavaScript 的 DOM 操作 JavaScript允许你动态地修改HTML文档中的元素内容。你可以使用document.getElementB…