Boost.Asio 的 TCP 通信教程

news2025/1/8 7:41:35

一、引言

本教程将详细介绍如何使用 Boost.Asio 库实现一个简单的 TCP 通信示例,包括服务器端和客户端的代码编写、编译以及运行流程。同时,我们会对通信过程中的各个关键步骤进行详细讲解,帮助读者理解 TCP 通信在 Boost.Asio 中的实现方式。后续如果需要扩展功能,例如并发处理多个客户端连接或使用异步通信等,可以在此基础上进行修改。

二、准备工作

  1. 确保系统中已安装 Boost 库。
  2. 确保编译器(如 g++)能够正常识别并使用 Boost 的头文件和链接库。
  3. Boost.Asio 是头文件库,但需要链接 Boost.System 库,因此编译时需加入 -lboost_system 参数。

三、服务器端代码讲解

(一)创建 io_context

在服务器端代码中,首先需要创建一个 io_context 对象,它是 Boost.Asio 用于调度 I/O 操作的核心对象。

// Step 1: 创建 io_context
boost::asio::io_context ios;

ios 对象是 I/O 操作的调度中心,后续操作都依赖于它。

(二)创建并绑定 acceptor

为了监听指定端口等待客户端连接,需要创建并绑定一个 ip::tcp::acceptor 对象。

// Step 2: 创建并绑定 acceptor
boost::asio::ip::tcp::acceptor acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 3333));
std::cout << "Server is listening on port 3333..." << std::endl;

上述代码将 acceptor 对象绑定到 IPv4 协议的本地地址(127.0.0.1)和端口 3333

(三)等待客户端连接

通过 acceptor 对象的 accept 方法等待并接收客户端的连接请求。当有客户端连接时,会生成一个与客户端通信的 socket 对象。

// Step 3: 等待客户端连接
boost::asio::ip::tcp::socket socket(ios);
acceptor.accept(socket);
std::cout << "Client connected!" << std::endl;
(四)接收数据

通过 socket 接收客户端发送的数据。

// Step 4: 接收数据
char data[1024] = {0};
size_t length = socket.read_some(boost::asio::buffer(data));
std::cout << "Received from client: " << std::string(data, length) << std::endl;

read_some 是同步操作,读取的数据会存入 data 缓冲区。

(五)发送数据

服务器可以通过 socket 向客户端发送数据。

// Step 5: 发送数据
std::string message = "Hello from server!";
boost::asio::write(socket, boost::asio::buffer(message));

boost::asio::write 是同步写操作,将 message 内容发送给客户端。

(六)关闭 socket

通信结束后,关闭 socket 释放资源。

// Step 6: 关闭 socket
socket.close();
std::cout << "Connection closed!" << std::endl;

为提高程序的健壮性,以上代码应放在 try-catch 块中捕获异常。

完整的服务器端代码如下:

#include <boost/asio.hpp>
#include <iostream>

int main() {
    try {
        boost::asio::io_context ios;
        boost::asio::ip::tcp::acceptor acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 3333));
        std::cout << "Server is listening on port 3333..." << std::endl;

        boost::asio::ip::tcp::socket socket(ios);
        acceptor.accept(socket);
        std::cout << "Client connected!" << std::endl;

        char data[1024] = {0};
        size_t length = socket.read_some(boost::asio::buffer(data));
        std::cout << "Received from client: " << std::string(data, length) << std::endl;

        std::string message = "Hello from server!";
        boost::asio::write(socket, boost::asio::buffer(message));

        socket.close();
        std::cout << "Connection closed!" << std::endl;
    } catch (std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

四、客户端代码讲解

(一)创建 io_context

客户端首先需要创建一个 io_context 对象。

// Step 1: 创建 io_context
boost::asio::io_context ios;
(二)创建 socket 并连接到服务器

通过 socket 对象的 connect 方法连接到服务器。

// Step 2: 创建 socket 并连接到服务器
boost::asio::ip::tcp::socket socket(ios);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 3333);
socket.connect(endpoint);
std::cout << "Connected to server!" << std::endl;
(三)发送数据

客户端可以通过 socket 向服务器发送数据。

// Step 3: 发送数据
std::string message = "Hello from client!";
boost::asio::write(socket, boost::asio::buffer(message));
(四)接收数据

客户端接收服务器发送的回复。

// Step 4: 接收数据
char data[1024] = {0};
size_t length = socket.read_some(boost::asio::buffer(data));
std::cout << "Received from server: " << std::string(data, length) << std::endl;
(五)关闭 socket

通信结束后,关闭 socket 连接。

// Step 5: 关闭 socket
socket.close();
std::cout << "Connection closed!" << std::endl;

完整的客户端代码如下:

#include <boost/asio.hpp>
#include <iostream>

int main() {
    try {
        boost::asio::io_context ios;
        boost::asio::ip::tcp::socket socket(ios);
        boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 3333);
        socket.connect(endpoint);
        std::cout << "Connected to server!" << std::endl;

        std::string message = "Hello from client!";
        boost::asio::write(socket, boost::asio::buffer(message));

        char data[1024] = {0};
        size_t length = socket.read_some(boost::asio::buffer(data));
        std::cout << "Received from server: " << std::string(data, length) << std::endl;

        socket.close();
        std::cout << "Connection closed!" << std::endl;
    } catch (std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

五、代码编译与运行

(一)保存代码
  • 将服务器端代码保存为 server.cpp
  • 将客户端代码保存为 client.cpp
(二)编译代码
  • 服务器端
g++ server.cpp -o server -lboost_system
  • 客户端
g++ client.cpp -o client -lboost_system
(三)运行代码
  1. 启动服务器:
./server
  1. 启动客户端:
./client

服务器与客户端建立连接后,会互相发送并接收消息,完成通信流程。

六、总结

本教程展示了一个简单的 Boost.Asio 同步 TCP 通信示例,从服务器端和客户端代码的编写到编译和运行,涵盖了关键的操作步骤。读者可以在此基础上探索更复杂的功能,如并发处理多个客户端连接或使用异步操作,以满足更高级的应用需求。

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

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

相关文章

【免费】2004-2019年各省规模以上工业企业RD经费面板数据

2004-2019年各省规模以上工业企业R&D经费面板数据 1、时间&#xff1a;2004-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、规模以上工业企业R&D经费(万元) 4、范围&#xff1a;31省 5、规模以上工企&#xff0c…

电路学习(一)之电阻

电阻在电路中具有限制电流、分流、分压等功能&#xff0c;是电路中必不可少的组成部分。 1.什么是电阻&#xff1f; 电阻是一种符合欧姆定律&#xff08;R&#xff09;、限制电流流动的线性元件。简单来说&#xff0c;电阻就是可以限制电流流过的电子器件&#xff0c;其主要功…

Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力

近年来&#xff0c;Facebook在元宇宙领域的探索引起了广泛关注。元宇宙是一个融合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和互联网的沉浸式数字空间。在这个过程中&#xff0c;智能合约技术被认为是提升虚拟空间自治能力的关键工具。通过自动…

SSR 【1】【nuxt安装】

文章目录 前言如何解决 前言 nuxt提供了nuxi脚手架工具&#xff0c;让开发者便捷生成nuxt模板项目。nuxt官网 npx nuxilatest init <project-name>但是几乎大部分的人在安的时候都会遇到这个问题 如何解决 在C:\Windows\System32\drivers\etc\hosts中增加如下解析记录…

mv指令详解

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

【APP】5分钟上手基于BurpSuite的APP抓包

step 1 手机和电脑连上同一个wifi step 2 ipconfig -all查看电脑在WLAN下的IP 这里为10.0.23.80 step3 bp设置监听的端口和ip&#xff0c;ip设置为上一步看到的ip step4 bp导出证书 der后缀改为cer 传给手机 step5 在设置中搜索证书&#xff0c;按步骤安装证书 step6 在…

【工业场景】用YOLOv8实现工业安全帽识别

工业安全帽识别是一项重要的工作安全管理措施&#xff0c;旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型&#xff0c;可以实时准确地检测出工人是否佩戴安全帽&#xff0c;及时发现违规行为&#xff0c;为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…

51单片机——共阴数码管实验

数码管中有8位数字&#xff0c;从右往左分别为LED1、LED2、...、LED8&#xff0c;如下图所示 如何实现点亮单个数字&#xff0c;用下图中的ABC来实现 P2.2管脚控制A&#xff0c;P2.3管脚控制B&#xff0c;P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

云安全博客阅读(二)

2024-05-30 Cloudflare acquires BastionZero to extend Zero Trust access to IT infrastructure IT 基础设施的零信任 不同于应用安全&#xff0c;基础设置的安全的防护紧急程度更高&#xff0c;基础设施的安全防护没有统一的方案IT基础设施安全的场景多样&#xff0c;如se…

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中&#xff0c;AlarmManager 是一个非常重要的系统服务&#xff0c;用于设置定时任务或者周期性任务。无论是设置一个闹钟&#xff0c;还是定时进行数据同步&#xff0c;AlarmManager 都是不可或缺的工具之一。然而&#xff0c;随着 Android 系统的不断演…

SAP销售订单的计划行类别是什么?销售订单是如何传递需求给MRP的?

文章目录 一、销售订单计划行类别的参数二、销售订单的项目类别的配置VOV4三、计划行类别的配置VOV6四、对销售订单项目类别分配计划行类别VOV5五、自定义计划行类别 【SAP系统PP模块研究】 #SAP #SD #PP #计划 #需求传递 一、销售订单计划行类别的参数 销售订单主体包括Head…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

Web渗透测试之XSS跨站脚本 原理 出现的原因 出现的位置 测试的方法 危害 防御手段 面试题 一篇文章给你说的明明白白

目录 XSS介绍的原理和说明 Cross Site Scripting 钓鱼 XSS攻击原理 XSS漏洞出现的原因&#xff1a; XSS产生的原因分析 XSS出现位置&#xff1a; XSS测试方法 XSS的危害 防御手段&#xff1a; 其它防御 面试题: 备注&#xff1a; XSS介绍的原理和说明 嵌入在客户…

【C++】字符串与字符数|组操作详解:strcpy 和 strcat 的使用与解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、字符串数组的基本操作&#x1f4af;二、strcpy 的用法详解1. strcpy 的功能与原型2. 使用示例与代码演示3. 注意事项4. 扩展&#xff1a;为什么不能直接用 &#xff1f…

玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令

前面分享过很多 常用的adb命令&#xff0c;今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …

UI自动化测试保姆级教程①

欢迎来到阿妮莫的学习小屋慢也好&#xff0c;步子小也好&#xff0c;在往前走就好 目录 自动化测试 简介 作用 分类 优缺点 优点 缺点(误区) UI自动化测试 自动化测试使用场景 自动化测试实现时间 Selenium框架 特点 Web自动化测试环境部署 Selenium包安装 浏览…

加速科技荣获“浙江省企业研究院”认定

近日&#xff0c;浙江省经济和信息化厅公布“2024年认定&#xff08;备案&#xff09;省级企业研发机构名单”。经过多轮严格评审和公示&#xff0c;加速科技荣获“省企业研究院”认定。这是加速科技继获国家级专精特新“小巨人”企业认定荣誉后的又一里程碑。 “浙江省企业研究…

RAG实战:本地部署ragflow+ollama(linux)

1.部署ragflow 1.1安装配置docker 因为ragflow需要诸如elasticsearch、mysql、redis等一系列三方依赖&#xff0c;所以用docker是最简便的方法。 docker安装可参考Linux安装Docker完整教程&#xff0c;安装后修改docker配置如下&#xff1a; vim /etc/docker/daemon.json {…

运动相机拍摄的视频打不开怎么办

3-10 GoPro和大疆DJI运动相机的特点&#xff0c;小巧、高清、续航长、拍摄稳定&#xff0c;很多人会在一些重要场合用来拍摄视频&#xff0c;比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品&#xff0c;有时候是会出点问题的&#xff0c;比如意外断电、摔重…

【深度学习】深度(Deep Learning)学习基础

深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于人工神经网络的机器学习方法&#xff0c;通过多个层次&#xff08;深度&#xff09;的神经网络从数据中自动学习特征和模式。它是人工智能的一个核心领域&#xff0c;尤其在处理复杂数据&#xff08;如图像、…