当前位置: 首页 > news >正文

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录

一、编译Boost库

 二、TCP服务端

三、TCP客户端

四、UDP连接


一、编译Boost库

1. 先去官网下载Boost库源码

2. 点击下载最新的版本

下载Windows环境的压缩包,然后解压

3. 在解压后的目录路径下找到“bootstrap.bat”

打开控制台,在“bootstrap.bat”的路径下输入

.\bootstrap.bat

执行完成后,就会在当前目录生成一个可执行文件 b2.exe

4. 直接运行“b2.exe”。

编译好后,其默认的安装路径为当前目录下的stage\lib文件夹内

而头文件就在下载当前目录的boost目录里面。

5. 打开VS编辑器并加载工程,点击“项目-》属性”

在“包含目录”中点击“编辑”

添加包含目录如下

在“库目录”中点击“编辑”

添加库目录如下

6. 添加后使用一段测试代码看看是否有报错,能否通过编译

#include<iostream>
#include"boost/asio.hpp"
using namespace std;
using namespace boost;
using asio::ip::tcp;int main() {cout << "server start ……" << endl;asio::io_context io;tcp::acceptor acptr(io, tcp::endpoint(tcp::v4(), 6688));tcp::socket sock(io);acptr.accept(sock);cout << "client:" << sock.remote_endpoint().address() << endl;try {while (true) {char buf[0xFF];sock.receive(asio::buffer(buf));sock.send(asio::buffer(buf));}}catch(std::exception& e) {cout << e.what();}sock.close();::system("pause");
}

 二、TCP服务端

基于 Boost.Asio 库实现简单 TCP 服务器的代码如下。

实现功能:该服务器可以接受多个客户端的连接,接收客户端发送的数据,并将客户端发送的数据回传给客户端。当客户端断开连接时,服务器会检测到并打印信息。

 头文件(TCPServer_ByBoost.h):

#pragma once
#include <iostream>
#include <boost/asio.hpp>using boost::asio::ip::tcp;class TCPServer {
public:TCPServer(short port) : acceptor(io_context, tcp::endpoint(tcp::v4(), port)) {//初始化acceptor成员变量,acceptor是一个tcp::acceptor类型的对象,它使用io_context和一个tcp::endpoint对象进行初始化。//tcp::endpoint对象表示服务器要监听的地址和端口,这里使用tcp::v4()表示 IPv4 地址,端口号由传入的参数port决定。//io_context是 Boost.Asio 的输入输出上下文,用于管理异步操作。startAccept();  //接受客户端的连接请求}~TCPServer() {io_context.stop();  //停止io_context的运行,以确保所有异步操作都能正确结束。}void startAccept();void handleClient(tcp::socket& socket);private:boost::asio::io_context io_context;tcp::acceptor acceptor;
};

源文件(TCPServer_ByBoost.cpp) 

#include "TCPServer_ByBoost.h"void TCPServer::startAccept() {  //startAccept()用于开始接受客户端连接tcp::socket socket(io_context);  //创建一个tcp::socket对象socket,并使用io_context进行初始化。acceptor.async_accept(socket, [this, &socket](const boost::system::error_code& error) {  //使用acceptor.async_accept异步接受客户端连接。这个方法会在有客户端连接时调用传入的回调函数。回调函数接受一个boost::system::error_code类型的参数error,用于表示是否有错误发生。if (!error) {tcp::endpoint clientEndpoint = socket.remote_endpoint();std::cout << "Client: " << std::string(clientEndpoint.address().to_string()) + ":" + std::to_string(clientEndpoint.port()) + " connected" << std::endl;  //打印客户端的ip和端口std::thread clientThread([this, &socket]() {handleClient(socket);});clientThread.detach();  //使用detach方法将线程分离,使其在后台独立运行,不等待线程结束}startAccept();});io_context.run();  //io_context.run()启动io_context的事件循环,处理异步操作}void TCPServer::handleClient(tcp::socket& socket) {  //handleClient()用于处理与单个客户端的通信char buffer[1024];while (true) {boost::system::error_code error;tcp::endpoint clientEndpoint = socket.remote_endpoint();size_t length = socket.read_some(boost::asio::buffer(buffer), error);  //使用socket.read_some异步读取数据到buffer中。这个方法会在有数据可读时读取一部分数据,并返回读取的字节数。如果发生错误,将错误码存储在error中if (error == boost::asio::error::eof) {  //客户端关闭了连接std::cout << "Client: " << std::string(clientEndpoint.address().to_string()) + ":" + std::to_string(clientEndpoint.port()) + " closed" << std::endl;break;}else if (error) {  //其它错误std::cerr << "Error reading from client: " << error.message() << std::endl;break;}else {buffer[length] = '\0';std::cout << std::string(clientEndpoint.address().to_string()) + ":" + std::to_string(clientEndpoint.port()) + " Received: " << std::string(buffer) << std::endl;boost::asio::write(socket, boost::asio::buffer(buffer, length));}}socket.close();  //关闭与客户端的连接}

调用:

#include"TCPServer_ByBoost.h"int main() {try {TCPServer server(8888);}catch (const std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;
}

 运行结果:

三、TCP客户端

基于 Boost.Asio 库实现简单 TCP 客户端的代码如下。

实现功能:客户端定时向服务端发送数据,同时能够异步接收服务端发送来的数据。

头文件(TCPClient_ByBoost.h):

#pragma once
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>using boost::asio::ip::tcp;class TCPClient {
public:TCPClient(const std::string& serverAddress, short serverPort) : io_context(), socket(io_context) {  //接受服务器地址和端口号作为参数tcp::resolver resolver(io_context);  //创建一个tcp::resolver对象,用于解析服务器地址和端口号,得到连接服务器的端点列表tcp::resolver::results_type endpoints = resolver.resolve(serverAddress, std::to_string(serverPort));boost::asio::connect(socket, endpoints);  //使用boost::asio::connect连接到服务器的其中一个端点startReceive();  //开始异步接收服务端数据};void sendMessage(const std::string& message);  //接受一个字符串参数,表示要发送给服务器的消息void startReceive();
private:boost::asio::io_context io_context;tcp::socket socket;boost::asio::streambuf receiveBuffer;
};

源文件(TCPClient_ByBoost.cpp)

#include "TCPClient_ByBoost.h"void TCPClient::sendMessage(const std::string& message) {  //接受一个std::string类型的参数message,表示要发送给服务器的消息内容。boost::asio::write(socket, boost::asio::buffer(message));  //使用boost::asio::write函数将给定的消息写入到客户端的socket中,从而实现向服务器发送消息的功能
};void TCPClient::startReceive() {async_read(socket, receiveBuffer, boost::asio::transfer_at_least(1),  //使用async_read函数异步读取数据,只要接收到至少1个字节的数据就会触发回调[this](const boost::system::error_code& error, std::size_t bytes_transferred) {  //回调函数接受两个参数,const boost::system::error_code& error表示是否有错误发生,std::size_t bytes_transferred表示读取的字节数。if (!error) {std::cout << "Raw buffer content: ";std::istreambuf_iterator<char> eos;std::string bufferContent(std::istreambuf_iterator<char>(&receiveBuffer), eos);std::cout << bufferContent << std::endl;startReceive();  // 继续接收下一条消息}else {std::cerr << "Error receiving data: " << error.message() << std::endl;}});boost::thread ioThread([this]() { io_context.run(); });  //创建一个新的线程ioThread,在线程中运行io_context的事件循环。这样可以确保异步读取操作能够在后台持续进行ioThread.detach();  //使用detach方法将线程分离,使其在后台独立运行
}

 调用:

#include"TCPClient_ByBoost.h"int main() {try {TCPClient client("127.0.0.1", 8888);while (true) {// 在主线程中定期向服务器发送消息,不会被接收数据阻塞client.sendMessage("Hello from client.");boost::this_thread::sleep_for(boost::chrono::seconds(5));}}catch (std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;
}

运行结果:

四、UDP连接

基于 Boost.Asio 库实现简单 UDP 连接的代码如下。

实现功能:可以接受多个连接,接收到数据后会将接收的数据回传。

头文件(UDP_ByBoost.h) 

#pragma once#include <iostream>
#include <boost/asio.hpp>using boost::asio::ip::udp;class UDPServer {
public:UDPServer(short port) : socket(io_context, udp::endpoint(udp::v4(), port)) {startReceive();}~UDPServer() {io_context.stop();}void startReceive();void startSend(std::size_t length);private:boost::asio::io_context io_context;udp::socket socket;udp::endpoint remote_endpoint;char buffer[1024];
};

 源文件(UDP_ByBoost.cpp)

#include "UDP_ByBoost.h"void UDPServer::startReceive() {socket.async_receive_from(boost::asio::buffer(buffer), remote_endpoint,  //socket.async_receive_from异步接收数据。当有数据到达时,回调函数会被调用。[this](const boost::system::error_code& error, std::size_t bytes_transferred) {if (!error) {std::cout << "Received from " << remote_endpoint.address().to_string() << ":" << remote_endpoint.port() << std::endl;std::cout << "Received data: " << buffer << std::endl;startSend(bytes_transferred);}else {std::cerr << "Error receiving data: " << error.message() << std::endl;}startReceive();});io_context.run();
}void UDPServer::startSend(std::size_t length) {socket.async_send_to(boost::asio::buffer(buffer, length), remote_endpoint,  //socket.async_send_to异步发送数据回给客户端。当数据发送完成后,回调函数会被调用。[this](const boost::system::error_code& error, std::size_t bytes_sent) {if (!error) {std::cout << "Sent data back to " << remote_endpoint.address().to_string() << ":" << remote_endpoint.port() << std::endl;}else {std::cerr << "Error sending data: " << error.message() << std::endl;}});
}

调用: 

#include"UDP_ByBoost.h"int main() {try {UDPServer server(12345);}catch (const std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;
}

运行结果

相关文章:

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包&#xff0c;然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台&#xff0c;在“bootstrap.…...

怎么提取pdf的某一页?批量提取pdf的某一页的简单方法

怎么提取pdf的某一页&#xff1f;在日常工作与学习中&#xff0c;我们经常会遇到各式各样的PDF文件&#xff0c;它们以其良好的兼容性和稳定性&#xff0c;成为了信息传输和存储的首选格式。然而&#xff0c;在浩瀚的文档海洋中&#xff0c;有时某个PDF文件中的某一页内容尤为重…...

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…...

快读快写模板

原理 众所周知&#xff0c;在c中&#xff0c;用putchar和getchar输入输出字符的速度是很快的&#xff0c;因此&#xff0c;我们可以考虑把数字转化为字符&#xff0c;按位输出&#xff1b;把字符读入后转化为数字的每一位。 该快读快写可以实现对所有整数类型的输入。 templ…...

make_blobs函数

make_blobs 是 scikit-learn 库中用于生成聚类&#xff08;或分类&#xff09;数据集的函数。它通常用于生成多个高斯分布的簇状数据&#xff0c;以便进行分类或聚类算法的测试和验证。make_blobs 非常灵活&#xff0c;可以控制簇的数量、样本数量、每个簇的标准差、中心点等参…...

特斯拉Optimus:展望智能生活新篇章

近日&#xff0c;特斯拉举办了 "WE ROBOT" 发布会&#xff0c;发布会上描绘的未来社会愿景&#xff0c;让无数人为之向往。在这场吸引全球无数媒体的直播中&#xff0c;特斯拉 Optimus 人形机器人一出场就吸引了所有观众的关注。从多家媒体现场拍摄的视频可以看出来&…...

基于Leaflet和SpringBoot的全球国家综合检索WebGIS可视化

目录 前言 一、Java后台程序设计 1、业务层设计 2、控制层设计 二、WebGIS可视化实现 1、侧边栏展示 2、空间边界信息展示 三、标注成果展示 1、面积最大的国家 2、国土面积最小的国家 3、海拔最低的国家 4、最大的群岛国家 四、总结 前言 在前面的博文中&#xff…...

【Linux】/usr/share目录

在Linux和类Unix操作系统中&#xff0c;/usr/share 目录是一个用于存放共享数据文件的目录。这个目录遵循Filesystem Hierarchy Standard (FHS)&#xff0c;它定义了Linux系统中文件和目录的组织结构。/usr 代表 “user”&#xff0c;而 share 表示这些文件可以被系统上的多个用…...

Java中如何应用序列化 serialVersionUID 版本号呢?

文章目录 示例1&#xff1a;没有 serialVersionUID 的类输出结果&#xff1a;示例2&#xff1a;类修改后未定义 serialVersionUID可能出现的问题&#xff1a;示例3&#xff1a;显式定义 serialVersionUID总结最佳实践推荐阅读文章 为了更好地理解 serialVersionUID 的使用&…...

面部识别技术:AI 如何识别人脸

在科技飞速发展的今天&#xff0c;面部识别技术已经广泛应用于各个领域&#xff0c;从手机解锁到安防监控&#xff0c;从金融支付到门禁系统&#xff0c;面部识别技术正在改变着我们的生活方式。那么&#xff0c;AI 究竟是如何识别人脸的呢&#xff1f;让我们一起来揭开面部识别…...

全面解析文档对象模型(DOM)及其操作(DOM的概念与结构、操作DOM节点、描述DOM树的形成过程、用DOMParser解析字符串为DOM对象)

1. 引言 文档对象模型&#xff08;DOM&#xff09;是Web开发中的核心概念&#xff0c;它提供了一种结构化的方法来表示和操作HTML和XML文档。通过DOM&#xff0c;开发者可以动态地访问和更新文档的内容、结构和样式。本文将深入探讨DOM的概念与结构、操作DOM节点的方法、DOM树…...

字符串使用方法:

字符串: -- 拼接字符串 SELECT CONCAT(糯米,啊啊啊撒,删掉); -- 字符长度 SELECT LENGTH(asssssssggg); -- 转大写 SELECT UPPER(asdf); -- 转小写 SELECT LOWER(ASDFG); -- 去除左边空格 SELECT LTRIM( aaaasdrf ); -- 去除右边空格 SELECT RTRIM( aaaasdff ); -- 去除两端…...

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…...

E/MicroMsg.SDK.WXMediaMessage:checkArgs fail,thumbData is invalid 图片资源太大导致分享失败

1、微信分享报&#xff1a; 2、这个问题是因为图片太大导致&#xff1a; WXWebpageObject webpage new WXWebpageObject();webpage.webpageUrl qrCodeUrl;//用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象WXMediaMessage msg new WXMediaMessage(webpage);msg.tit…...

No.21 笔记 | WEB安全 - 任意文件绕过详解 part 3

&#xff08;一&#xff09;空格绕过 原理 Windows系统将文件名中的空格视为空&#xff0c;但程序检测代码无法自动删除空格&#xff0c;使攻击者可借此绕过黑名单限制。基于黑名单验证的代码分析 代码未对上传文件的文件名进行去空格处理&#xff0c;存在安全隐患。相关代码逻…...

咸鱼自动发货 免费无需授权

下载&#xff1a;&#xff08;两个都可以下&#xff0c;自己选择&#xff09; https://pan.quark.cn/s/1e3039e322ad https://pan.xunlei.com/s/VO9ww89ZNkEg_Fq1wRr-fk9ZA1?pwd8x9s# 不是闲管家 闲鱼自动发货&#xff08;PC端&#xff09; 暂不支持密&#xff0c;免费使…...

Netty核心组件

1.Channel Channel可以理解为是socket连接&#xff0c;在客户端与服务端连接的时候就会建立一个Channel&#xff0c;它负责基本的IO操作&#xff08;binf()、connect()、rad()、write()等&#xff09;&#xff1b; 1.1 Channel的作用 通过Channel可获得当前网络连接的通道状态…...

Windows中如何安装SSH

主要内容 一、参考资料二、主要过程法一&#xff1a;通过「设置」安装法二&#xff1a;使用 PowerShell进行安装在 Windows 中配置 OpenSSH 服务器过程截图 一、参考资料 Windows10 打开ssh服务&#xff0c;报错“The service name is invalid ” windows开启ssh服务教程 在 W…...

在linux上部署ollama+open-webu,且局域网访问教程

在linux上部署ollamaopen-webu&#xff0c;且局域网访问教程 运行ollamaopen-webui安装open-webui &#xff08;待实现&#xff09;下一期将加入内网穿透&#xff0c;实现外网访问功能 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并使用Op…...

基于大模型的招聘智能体:从创意到MVP

正在考虑下一个 SaaS 创意&#xff1f;以下是我在短短几个小时内从创意到 MVP 的过程。 以下是我将在这篇文章中介绍的内容概述&#xff1a; 为什么这个想法让我产生共鸣我是如何开始构建它的我现在的处境以及我是否会真正推出 获得 SaaS 创意并构建它并不容易。就是这样。 …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...