VS2022通过C++网络库Boost.Asio创建一个简单的同步TCP服务器和客户端

Boost.Asio是一个用于网络和异步编程的C++库。它提供了一种跨平台的方式来处理网络编程和异步操作,使开发人员能够创建高性能的网络应用程序,asio几乎支持所有你能够想到的网络协议,比如tcp、udp、ip、http、icmp等,C++通过asio库可以轻松实现tcp和http服务器。(本博客默认你已经安装好了boost库,并且博主的boost库版本是1.84.0,集成环境是VS2022)。

第一步配置boost库的开发环境,相比于其他库,VS2022配置boost库的开发环境比较简单,只需要包含头文件和静态链接库就可以了。

首先创建两个C++控制台项目,BoostClient和BoostServer。

打开BoostClient的属性,包含boost的头文件目录和静态链接库目录就可以了。

首先是服务器端的代码。

#include <iostream>
#include<boost/asio.hpp>
#include<string>
int main()
{int port = 3333;std::string saddr = "127.0.0.1";boost::asio::ip::address addr = boost::asio::ip::address::from_string(saddr);boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(addr, port);boost::asio::ip::tcp::acceptor ac(ioc, ep);while (true){boost::asio::ip::tcp::socket soc(ioc);//创建套接字必须使用上下文ac.accept(soc);char request[100] = "";soc.receive(boost::asio::buffer(request, 100));std::cout << "成功接收到了客户端的消息:" << request<<std::endl;std::string reply = "你好客户端,服务器成功接收到了你的消息";soc.send(boost::asio::buffer(reply, reply.size()));soc.close();}return 0;
}

同步类型的TCP服务器搭建起来相对简单,首先创建一个上下文对象ioc,然后再创建一个端点对象ep,再创建一个监听套接字对象ac,创建套接字对象必须要借助上下文对象,这是必须的,至于端点对象,你可以直接将它传入acceptor的构造函数中,这样就省略了绑定这一操作了,否则,你需要在创建完ac之后再调用bind函数,将ac和ep进行绑定。(其实acceptor就是一个特殊的套接字对象,本质就是套接字)。

ac.bind(ep);

然后就是接收客户端的响应了,可以使用receive函数也可以使用read_some函数,发送响应就使用send函数或者write_some函数。

接着就是客户端代码。

#include <iostream>
#include<boost/asio.hpp>
int main()
{boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 3333);boost::asio::ip::tcp::socket soc(ioc);soc.connect(ep);char request[100] = "";std::cin >> request;soc.send(boost::asio::buffer(request, 100));char rce[100] = "";soc.receive(boost::asio::buffer(rce, 100));std::cout << "成功收到了消息:" << rce<<std::endl;char reply[100] = { "你好服务器,这里是客户端,我们成功收到了消息" };soc.send(boost::asio::buffer(reply, 300));
}

同样地要先创建上下文,因为创建套接字必须使用上下文对象,然后创建端点对象,并把套接字对象连接到对应的端点进程,这样客户端和服务器端就成功连接了,之后用send和recevie函数进行数据读写就可以了。

运行代码,首先运行服务器的代码。

再运行两次客户端代码,依次输入1和2,注意先不要回车

输入2后进行回车,发现没有响应,是因为1先连接到了服务器,将线程阻塞了,必须执行完1的程序才会执行2的程序。

再对1进行回车,发现两个程序都成功执行了。

服务器端也成功接收到了消息。

注意点:使用char数组来接收客户端发送的消息的主要原因是,Boost.Asio的读取操作需要一个可变的缓冲区,而char数组提供了这样的缓冲区。Boost.Asio的读取操作函数,如read_some()和receive,需要一个可变的缓冲区作为参数,用于存储从套接字接收的数据。char数组是一种连续的内存块,可以用于存储二进制数据,因此在这种情况下非常适合作为缓冲区。另一方面,std::string是一个动态大小的字符序列,它可以自动调整大小以适应不同长度的字符串。虽然std::string也提供了访问底层字符数组的方法(如`c_str()`和`data()`),但它并不是一个可变的缓冲区,而是一个字符串容器,所以在接收请求的时候更加推荐使用char类型的字符串,并且所有字符串都要初始化为空,不然会中文乱码。

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

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

相关文章

浅谈网络通信(1)

文章目录 一、认识一些网络基础概念1.1、ip地址1.2、端口号1.3、协议1.4、协议分层1.5、协议分层的2种方式1.5.1、OSI七层模型1.5.2、TCP/IP五层模型[!]1.5.2.1、TCP/IP五层协议各层的含义及功能 二、网络中数据传输的基本流程——封装、分用2.1、封装2.2、分用2.2.1、5元组 三…

python冰雹序列的探索与编程实现

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、冰雹序列的奥秘 二、编程实现冰雹序列 三、测试与验证 四、总结与展望 一、冰雹序列的…

openEuler 22.03 LTS SP3源码编译部署OpenStack-Caracal

openEuler 22.03 LTS SP3源码编译部署OpenStack-Caracal 说明机器详情安装操作系统注意事项基础准备Controller节点 && Compute节点 && Block节点关闭防火墙关闭selinux设置静态IP更新安装前准备Controller节点 && Compute节点 && Block节点设…

第十课,while循环

一&#xff0c;认识循环是什么 循环普遍存在于日常生活中&#xff0c;同样&#xff0c;在程序中&#xff0c;循环功能也是至关重要的基础功能。 当程序需要重复执行某一段代码&#xff0c;利用循环可以轻松完成工作 例如我要你打印100次上课&#xff0c;直接写100次print&…

python调用阿里云通义千问(q-wen-max)API-只能总结pdf文档内容

文章目录 通义千问插件PDF解析插件调用案例通义千问插件 Dashscope插件功能能够使得大模型的生成内容与外部三方应用结合,使得模型生成的内容更加准确和丰富,模型将拥有更好的生成能力。您也可以通过开发自定义插件,来使得模型生成更符合您预期的结果。 使用插件功能,大模…

电子阅览室在管理时需注意什么

关于如今的绝大多数人来说&#xff0c;想必都听说过“电子阅览室”这一概念。它首要运用在校园中&#xff0c;给学生们供给愈加丰厚的常识储藏。它也是一个独立的局域网&#xff0c;在校园网络中作为重要的一个组成部分而存在。但是&#xff0c;一个好的电子阅览室是需求满意运…

CCF20231201——仓库规划

CCF20231201——仓库规划 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

设计模式在芯片验证中的应用——模板方法

一、模板方法 模板方法(Template Method)设计模式是一种行为设计模式&#xff0c; 它在父类中定义了一个功能的框架&#xff0c; 允许子类在不修改结构的情况下重写功能的特定步骤。也就是模板方法定义了一组有序执行的操作&#xff0c;将一些步骤的实现留给子类&#xff0c;同…

把自己的垃圾代码发布到官方中央仓库

参考博客&#xff1a;将组件发布到maven中央仓库-CSDN博客 感谢这位博主。但是他的步骤有漏缺&#xff0c;相对进行补充 访问管理页面 网址&#xff1a;Maven Central 新注册账号&#xff0c;或者使用github快捷登录&#xff0c;建议使用github快捷登录 添加命名空间 注意&…

【Linux】进程通信实战 —— 进程池项目

送给大家一句话: 没有一颗星&#xff0c;会因为追求梦想而受伤&#xff0c;当你真心渴望某样东西时&#xff0c;整个宇宙都会来帮忙。 – 保罗・戈埃罗 《牧羊少年奇幻之旅》 &#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️ &a…

flink cdc mysql整理与总结

文章目录 一、业务中常见的需要数据同步的场景CDC是什么FlinkCDC是什么CDC原理为什么是FlinkCDC业务场景flink cdc对应flink的版本 二、模拟案例1.阿里云flink sql2.开源flink sql(单机模式)flink 安装安装mysql3.flink datastream 三、总结 提示&#xff1a;以下是本篇文章正文…

kali基本扫描工具(自带)

免责声明:本文仅做技术交流与学习...请勿非法破坏... 详细用法: 命令 -h/百度/翻译 fping 用法 hostlist 文件里面为ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 输出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

香橙派AIpro使用SSH远程登录

香橙派AIpro可以连接HDMI显示器使用&#xff0c;也可以远程登录。这里采用MobaXterm软件远程登录开发板。 首先要使得控制电脑和香橙派开发板连接到同一个局域网&#xff0c;两者的IP地址能够ping通。在Windows 下可以使用MobaXterm 远程登录开发板&#xff0c;首先新建一个ss…

属于程序员的浪漫,一颗会跳动的心!!!

绘制一颗会跳动的心❤ 嘿嘿 可以说是程序员的专属浪漫了吧&#xff0c;就像点燃一颗LED灯一样&#xff1f;&#xff08;我瞎说的啊&#xff0c;大家别当真&#xff0c;我很菜的&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 程序就在下面啦&#xff0c;然…

Java8Stream

目录 什么是Stream? IO流&#xff1a; Java8Stream&#xff1a; 什么是流&#xff1f; stream图解 获取流 集合类&#xff0c;使用 Collection 接口下的 stream() 代码 数组类&#xff0c;使用 Arrays 中的 stream() 方法 代码 stream&#xff0c;使用 Stream 中的…

重生之 SpringBoot3 入门保姆级学习(02、打包部署)

重生之 SpringBoot3 入门保姆级学习&#xff08;02、打包部署&#xff09; 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…

Kubernetes(K8S) 集群环境搭建指南

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在自动化部署、扩展和管理容器化应用。K8S环境搭建过程比较复杂&#xff0c;涉及到非常多组件安装和系统配置&#xff0c;本文将会详细介绍如何在服务器上搭建好Kubernetes集群环境。 在学习…

面试题·栈和队列的相互实现·详解

A. 用队列实现栈 用队列实现栈 实现代码如下 看着是队列&#xff0c;其实实际实现更接近数组模拟 typedef struct {int* queue1; // 第一个队列int* queue2; // 第二个队列int size; // 栈的大小int front1, rear1, front2, rear2; // 两个队列的首尾指针 } MyS…

6.Redis之String命令

1.String类型基本介绍 redis 所有的 key 都是字符串, value 的类型是存在差异的~~ 一般来说,redis 遇到乱码问题的概率更小~~ Redis 中的字符串,直接就是按照二进制数据的方式存储的. (不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文…