boost下的asio异步高并发tcp服务器搭建
C++ 网络编程 asio 使用总结 - 知乎 (zhihu.com)
基于Boost::asio的多线程异步TCP服务器,实现了io_service线程池,测试了1万左右的并发访问,读写无压力_boost asio支持最大并发_E404的博客-CSDN博客
单线程
server.cpp
#include <cstdlib>
#include <ctime>#include <iostream>
#include <memory>
#include <utility>
#include <string>#include <boost/asio.hpp>using boost::asio::ip::tcp;class session : public std::enable_shared_from_this <session> //从enable_shared_from_this继承的类需要使用智能指针管理资源
{public:session(tcp::socket socket) : socket_(std::move(socket)) { } void start(){do_read(); }private:void do_read(){auto self(shared_from_this()); //对自己的引用计数+1socket_.async_read_some(boost::asio::buffer(data_,max_length),[this,self](boost::system::error_code ec , std::size_t length){printf("recv data:%s\n",data_);if(!ec){ do_write(length);}});}void do_write(std::size_t length){auto self(shared_from_this());boost::asio::async_write(socket_,boost::asio::buffer(data_,length),[this,self](boost::system::error_code ec , std::size_t){if(!ec){do_read(); }});}private:tcp::socket socket_;enum {max_length = 1024};char data_[max_length];
};class Server
{public:Server(boost::asio::io_service &io_service,short port) : acceptor_(io_service, tcp::endpoint(tcp::v4(),port)) , socket_(io_service) { }void start(){do_accept();}private:void do_accept(){acceptor_.async_accept(socket_ , [this](boost::system::error_code ec) //创建一个socket连接{if(!ec){auto newSession = std::make_shared<session>(std::move(socket_));newSession->start();} do_accept();});}tcp::acceptor acceptor_;tcp::socket socket_;
};int main(int argc,char *argv[])
{try{if(argc != 2){std::cerr << "请输入端口号:" << std::endl;return 1;}boost::asio::io_service io_service;Server s(io_service,std::atoi(argv[1]));s.start();io_service.run();}catch(std::exception &e){std::cerr << "异常:" << e.what() << std::endl;}return 0;
}
client.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888int i_sockfd = -1;void SigCatch(int sigNum) //信号捕捉函数(捕获Ctrl+C)
{if(i_sockfd != -1){close(i_sockfd);}printf("Bye~! Will Exit...\n");exit(0);
}int main()
{struct sockaddr_in st_clnsock;char msg[1024];int nrecvSize = 0;signal(SIGINT, SigCatch); //注册信号捕获函数if((i_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0) //建立套接字{printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(&st_clnsock, 0, sizeof(st_clnsock));st_clnsock.sin_family = AF_INET; //IPv4协议//IP地址转换(直接可以从物理字节序的点分十进制 转换成网络字节序)if(inet_pton(AF_INET, IP_ADDR, &st_clnsock.sin_addr) <= 0){printf("inet_pton Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}st_clnsock.sin_port = htons(IP_PORT); //端口转换(物理字节序到网络字节序)if(connect(i_sockfd, (struct sockaddr*)&st_clnsock, sizeof(st_clnsock)) < 0) //主动向设置的IP和端口号的服务端发出连接{printf("connect Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}printf("======connect to server, sent data======\n");while(1) //循环输入,向服务端发送数据并接受服务端返回的数据{fgets(msg, MAXSIZE, stdin);printf("will send: %s", msg);if(write(i_sockfd, msg, MAXSIZE) < 0) //发送数据{printf("write Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(msg, 0, sizeof(msg));if((nrecvSize = read(i_sockfd, msg, MAXSIZE)) < 0) //接受数据{printf("read Error: %s (errno: %d)\n", strerror(errno), errno);}else if(nrecvSize == 0){printf("Service Close!\n");}else{printf("Server return: %s\n", msg);}}return 0;
}
相关文章:
boost下的asio异步高并发tcp服务器搭建
C 网络编程 asio 使用总结 - 知乎 (zhihu.com) 基于Boost::asio的多线程异步TCP服务器,实现了io_service线程池,测试了1万左右的并发访问,读写无压力_boost asio支持最大并发_E404的博客-CSDN博客 单线程 server.cpp #include <cstdlib&g…...

HCIP第五节------------------------------------------ospf
一、OSPF基础 1、动态路由分类 2、距离矢量协议 运行距离矢量路由协议的路由器周期性地泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,然后再通告给其他相邻路由器。 对于网络中的所有…...

Golang下载安装
目录 1. 下载压缩包 2. 解压 3. 查看SDK是否安装成功 4. 配置环境变量 5. 查看环境变量是否配置成功 1. 下载压缩包 官网下载地址: All releases - The Go Programming Language Windows64位选择如下下载: 2. 解压 解压后内容如下: …...
工作时使用redis,kafka查阅的资料链接
不分先后 一 、redis查阅地址 一篇文章讲清楚RedisRedis原理介绍一篇详文带你入门 Redis内存耗尽后Redis会发生什么Redis 深入了解键的过期时间redis持久化机制Redis延迟问题全面排障指南一文搞定Redis高级特性与性能调优Redis 在 Linux 系统的配置优化Redis 的延迟问题&…...

上传excel文件
文件上传,其实就是用el-upload组件来实现上传,只是换了样式,和图片上传一样 <el-form-item label"选择文件"><el-input placeholder"请选择文件" v-model"form.file" disabled style"width: 45…...

leetcode 力扣刷题哈希表初尝试
哈希表 刷题初尝试 哈希表基础知识242. 有效的字母异位词383. 赎金信49. 字母异位词分组438. 找到字符串中所有字母异位词 哈希表基础知识 哈希表是一种数据结构,也叫散列表。哈希表中存储的是键值对,即(key,value),根据key直接查…...

Docker 本地镜像发布到私有仓库
1. 本地镜像发布到私有库流程 2. 是什么 1 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。 2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜…...
计算机网络和 Internet 的基本概念
计算机网络和互联网(Internet)是现代计算机科技中的重要概念。它们为计算机之间的通信和数据交换提供了基础架构。以下是它们的基本概念: **计算机网络:** 计算机网络是指将多台计算机连接在一起,以便它们可以共享资…...

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度
又到每天一期学习爬虫的时间了,作为一名专业的爬虫程序员,今天要跟你们分享一个超实用的技巧,就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上?别担心,我会用通俗易懂的话来和你们说,让你…...

CSS3 中新增了哪些常见的特性?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角(Border Radius)⭐ 渐变(Gradients)⭐ 阴影(Box Shadow)⭐ 文本阴影(Text Shadow)⭐ 透明度(Opacity)⭐ 过渡&…...

简单认识excel篇章1
excel是Office办公软件中的组件之一,它专长于对表格中的数据进行计算和统计管理,通常用于财务或其他数据管理的表格制作,同时excel还有很好的可视化能力,可用于制作各种行业报告。 在Microsoft Excel中,excel文件的后缀…...

CentOS系统环境搭建(九)——centos系统下使用docker部署项目
centos系统环境搭建专栏🔗点击跳转 关于Docker-compose安装请看CentOS系统环境搭建(三)——Centos7安装Docker&Docker Compose,该文章同样收录于centos系统环境搭建专栏。 Centos7部署项目 采用前后端分离的形式部署。使用Do…...

【科研论文配图绘制】task1 掌握科研绘图的基本知识
【科研论文配图绘制】task1 掌握科研绘图的基本知识 写在最前 8月份Datawhale组队学习,写下该博客记录学习内容 1.科研论文配图的分类与构成 2.科研论文配图的格式和尺寸 3.科研论文配图中的字体和字号设置 4.科研论文配图的版式设计、结构布局和颜色搭配 占个…...

YAML资源清单
目录 YAML资源清单 (一)YAML 语言 (1)基本语法 (2)支持的数据结构 (二)通过资源清单管理容器资源 YAML 语法格式: 创建Service资源清单 (三ÿ…...

数据分析两件套ClickHouse+Metabase(二)
Metabase篇 Metabase安装部署 任何问题请查看 -> 官方文档 jar包从GitHub下载 -> 地址 同样有个问题, 默认数据源里没有ClickHouse, 不过ClickHouse官方提供了插件包 -> 插件包 在安装metabase目录下新建一个plugins文件夹, 把下载的clickhouse.metabase-driver.ja…...
神经网络基础-神经网络补充概念-20-激活函数
概念 激活函数是神经网络中的一个重要组成部分,它引入了非线性性质,使得神经网络可以学习和表示更复杂的函数关系。激活函数对于将输入信号转换为输出信号起到了关键作用,它在神经元的计算过程中引入了非线性变换。 几种常见的激活函数及其…...

欧拉函数和最大公约数
分析:如果两个数的最大公约数是一个质数p,那么这两个数都除以p,得到的两个数的最大公约数一定是1. 反证法:如果得到的两个数的最大公约数不是1,那么把此时的最大公约数乘以上边的最大公约数,得到的一定比上…...
出牌游戏(game)
安徽省2016年信息学竞赛试题(小学组) 题目描述 Description 小学生卡卡西最喜欢的电影是哈利波特,她一直幻想着自己可以进入神奇的魔法世界,今年暑假的一个傍晚,一只猫头鹰带着一封神秘的邀请函来到了她的家中,邀请函里是一张车…...
踩坑---uni-app中@input 事件不生效
在开发的时候遇到这么一种情况,我们希望input输入框的值是范围是0-100或者保留两位小数之类的,当你输入时处理后的结果却不生效,但是试过很多办法发现都实现不了,最后是按照以下方法解决的,问题原因是uni-app会延时,导致输入的结果…...
Linux命令(66)之tar
linux命令之tar 1.tar介绍 linux命令tar是压缩打包工具,可以将多个文件合并为一个文件,打包后的文件后缀为tar。与其它linux命令不同的是,tar命令的用户为linux的所有用户。 2.tar用法 tar [参数] [fliename.压缩打包后缀] [filename] ta…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...