C++ asio异步网络库学习记录

news/2024/9/25 13:04:48/

最近几天在学习asio异步网络库,今天整理下前几日学习asio库同步读写demo的案例,明天我会整理asio配置的过程。

之前也学习过winsocket,但是不论是winsock还是asio都经历这样几个阶段:

服务端:

  1. socket创建socket套接字。
  2. bind绑定本机ip+port。
  3. listen监听,若在监听到请求,就建立起连接。
  4. accept 相当于接起电话。
  5. read、write拿起电话就可以开始说话了。

对于客户端是这样的
客户端:

  1. socket创建socket套接字。
  2. connect根据服务端ip+port,发起连接请求。
  3. write、read对面接起电话就可以说话了。

以下就是echo形式的同步读写demo

流程图

在这里插入图片描述

我们不难发现,这种echo类型的服务器虽然简单但是存在很多问题:

  1. 服务器一直在等待客户端发送消息,一直未收到消息就一直阻塞的,导致了服务器的效率很低下。
  2. 一问一答无法满足实际生活全双工的需求。
  3. 为了支持多个客户端,因此服务端开辟线程处理请求,但是一个系统开辟的线程是有限的且效率也会随着线程的数目增加而降低

因此这种服务器只是一个小玩具,不要有过多的依赖

客户端

#include<boost/asio.hpp>
#include <iostream>
using namespace std;
using namespace boost::asio::ip;
//定义消息最大长度
const int MAX_LENGTH = 1024;
int main()
{try {//上下文boost::asio::io_context ioc;//创建断点tcp::endpoint remote_ep(address::from_string("127.0.0.1"), 10086);tcp::socket sock(ioc);boost::system::error_code error = boost::asio::error::host_not_found;sock.connect(remote_ep, error);if (error) {cout << "connect failed, code is : " << error.value() << "error msg is : " << error.message();return 0;}std::cout << "Enter message: ";char request[MAX_LENGTH];std::cin.getline(request, MAX_LENGTH);size_t request_length = strlen(request);//第二个参数是ConstBufferSequence类型,可以理解为一个数组存储很多块地址的首地址//每个地址对应的内存卡块都是连续的内存空间,这样可以存储更多的数据boost::asio::write(sock, boost::asio::buffer(request, request_length));char reply[MAX_LENGTH];size_t reply_length = boost::asio::read(sock, boost::asio::buffer(reply, request_length));std::cout << "reply is : ";std::cout.write(reply, reply_length);std::cout << "\n";}catch (std::exception& e) {std::cerr << "exception : " << e.what();}return 0;}

服务端

#include <iostream>
#include<boost/asio.hpp>
#include<set>
#include<memory>
using boost::asio::ip::tcp;
using namespace std;
const int MAX_LENGTH = 1024;
typedef std::shared_ptr<tcp::socket> socket_ptr;
std::set<std::shared_ptr<std::thread>> thread_set;//服务器处理读和写
void session(socket_ptr sock) {try {for (;;) {char data[MAX_LENGTH];memset(data, '\0', MAX_LENGTH);boost::system::error_code error;//服务器一直再等待缓冲区满//size_t length = boost::asio::read(sock, boost::asio::buffer(data, MAX_LENGTH), error);size_t length = sock->read_some(boost::asio::buffer(data, MAX_LENGTH), error);if (error == boost::asio::error::eof){std::cout << "connection closed by peer" << endl;break;}else if (error) {throw boost::system::system_error(error);}cout << "receive from" << sock->remote_endpoint().address().to_string() << endl;cout << "receive message is" << data << endl;//回传数据boost::asio::write(*sock, boost::asio::buffer(data, length));}}catch (exception& e) {std::cerr << "Exception in thread:" << e.what() << "\n" << std::endl;}
}
void server(boost::asio::io_context& io_context, unsigned short port){tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port));for (;;) {socket_ptr socket(new tcp::socket(io_context));a.accept(*socket);//创建线程,session跑在独立的线程,是socket要做的工作,socket是工作人员,防止阻塞 但是占用线程并发量很低auto t = std::make_shared<std::thread>(session, socket);//防止线程还没跑完for循环结束,所以把智能指针储存起来计数thread_set.insert(t);}
}
int main()
{//主线程等待子线程退出再退出try {boost::asio::io_context ioc;server(ioc, 10086);for (auto& t : thread_set) {//调用 join() 会阻塞当前线程,直到 t 指向的线程完成执行。t->join();}}catch (std::exception& e) {std::cerr << "Exception:" << e.what() << endl;}
}

http://www.ppmy.cn/news/1530291.html

相关文章

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”&#xff0c;其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”&#xff0c;其他默认 …

14年408-计算机网络

第一题&#xff1a; 解析&#xff1a;OSI体系结构 OSI由下至上依次是&#xff1a;物理层-网络链路层-网络层-运输层-会话层-表示层-应用层。 因此直接为会话层提供服务的是运输层。答案选C 第二题&#xff1a; 解析&#xff1a;数据链路层-交换机的自学习和帧转发 主机a1向交换…

中电金信:源启智能视觉分析系统~助力各行业破局升级,释放新质生产力

作为人工智能与计算机视觉的交叉范畴&#xff0c;智能视觉模仿人类视觉机能&#xff0c;来对各种形式的视觉输入予以处理、理解以及决策。当下&#xff0c;智能视觉已然发展为应用广泛、市场覆盖面大且形式多元的产业方向&#xff0c;获得了国家政策的强力支持。数字化时代搭台…

GIS开发之如何使用OpenLayers,Leaflet,Mapbox,Cesium,ArcGIS, Turf.js 与 D3.js

1、OpenLayers&#xff1a; 描述&#xff1a;OpenLayers是一个高性能、开源的JavaScript库&#xff0c;用于在Web上创建富有的地图应用。它支持多种地图数据源&#xff0c;包括从瓦片服务到矢量数据&#xff0c;并提供了大量的交互功能。特点&#xff1a;功能强大、灵活易用&a…

【Kubernetes】常见面试题汇总(三十五)

目录 87.简述 pod 中 readiness 和 liveness 的区别和各自应用场景。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产应…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…

Go 语言的垃圾回收机制

Go 语言的垃圾回收机制&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;1. 垃圾回收的工作原理2. 并发与回收3. 优点和缺点4. 调整和监控在 Go 语言中&#xff0c;垃圾回收&#xff08;GC&#xff09;机制主要通过“引用计数”和“可达性分析”来判断资源是否需…

Nature Communications|一种快速响应的智能可穿戴嗅觉接口(可穿戴电子/柔性电子/人机交互)

香港城市大学于欣格( Xinge Yu)、北京航空航天大学李宇航(Yuhang Li)、中国特种设备检验研究所赵召(Zhao Zhao)和东京大学Takao Someya团队,在《Nature Communications》上发布了一篇题为“Intelligent wearable olfactory interface for latency-free mixed reality and …