通过 EPOLL 解决客户端同时连接多服务器的问题

项目需求是  程序上 同时配置了多个服务端 设备

每隔一段时间需要 比如1分钟 连一下服务器看下是否连通  

并将结果上报给平台 

原来是用线程池来做的  

具体大概就是 定时器到了之后 

遍历设备列表  找到设备之后  通过 socket连接 发送一个指令 等待服务器返回 用来检查是否在线 

这样的问题是 如果设备不是很多的话 还好  但是如果 有上百个设备 的话 

每一轮遍历需要很长时间  

后来 看了EPOLL尝试一下  

相当于是改成单线程了  但是效果不是很好  

基本上还是相当于单线程     测试结果感觉还是单线程在跑  

后期改成协程试下看看  

bool QMCY_APP::CreateEPOLL()
{m_epoll_fd = epoll_create1(0);if (m_epoll_fd < 0){printf("epoll_create failed\n");return false;}return true;
}

bool QMCY_APP::Add2Epoll(std::shared_ptr<IQMCY>  led)
{int fd;auto ip = led->NVR_GetIP().c_str();auto port = led->NVR_GetPort();struct sockaddr_in my_addr;socklen_t peer_addr_size;fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);if (fd == -1){printf("Add2Epoll Create socket failed\n");return false;}memset(&my_addr, 0, sizeof(my_addr));my_addr.sin_family = AF_INET;my_addr.sin_addr.s_addr = inet_addr(ip);my_addr.sin_port = htons(port);int ret = connect(fd, (struct sockaddr*)&my_addr, sizeof(my_addr));if (ret == 0) {puts("connect successfully!");return false;}if (errno != EINPROGRESS) printf("Add2Epoll success [%s:%d] \n",ip,port);struct epoll_event ev;ev.events = EPOLLOUT |EPOLLET |EPOLLIN;ev.data.fd = fd;if (epoll_ctl(m_epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1){printf("epoll_ctl failed\n");return false;}m_led_all.insert(std::pair<int,std::shared_ptr<IQMCY>>(fd,led));led->NVR_ResetState();return true;
}

bool QMCY_APP::HandleEPOLL()
{int timeout = 3000;	auto index = 0;struct epoll_event events[MAX_EVENTS];while(index <m_led_all.size()*2){int nfds = epoll_wait(m_epoll_fd, events, MAX_EVENTS, timeout);if (nfds < 0) {printf("epoll_wait\n");} else if (nfds == 0) {printf("epoll_wait timeout\n");} else {for (int n = 0; n < nfds; ++n) {printf("epoll_wait nfds:%d events:%d\n",nfds,events[n].events);		 	if (events[n].data.fd && (events[n].events & EPOLLOUT)) {int connect_error = 0;socklen_t len = sizeof(connect_error);if(getsockopt(events[n].data.fd, SOL_SOCKET, SO_ERROR, (void*)(&connect_error), &len) < 0){printf("getsockopt error\n");continue;}if (connect_error != 0) {printf("fd:[%d] connect: %s\n",events[n].data.fd, strerror(connect_error));continue;}else{auto fd = events[n].data.fd;auto led = m_led_all[fd];printf("QMCY 00000000000000000 connect to led success [ip:%s  port:%d]\n",led->NVR_GetIP().c_str(),led->NVR_GetPort());struct epoll_event ev = {0};ev.events = EPOLLET |EPOLLIN;ev.data.fd = fd;epoll_ctl(m_epoll_fd, EPOLL_CTL_MOD, fd, &ev);led->NVR_ProbeOnline(fd);}}else if (events[n].data.fd && (events[n].events & EPOLLIN)){char buf[BUFSIZ] = {0};int nread,n = 0;  auto fd = events[n].data.fd;while ((nread = read(fd, buf + n, BUFSIZ-1)) > 0) {  n += nread;  printf("n=%d nread=%d\n",n,nread);}  if (nread == -1 && errno != EAGAIN) {  perror("read error");  continue;} auto led = m_led_all[fd];printf("11111111Read data success [ip:%s	port:%d read=%d]\n",led->NVR_GetIP().c_str(),led->NVR_GetPort(),n);if(n>0){led->NVR_ProbeAnalyse(buf,n);						}}}}index++;printf("HandleEPOLL  loop index =%d ~~~~~~~~~~~~~~~~~\n",index);//sleep(1);}printf("HandleEPOLL end exit ~~~~~~~~~~~~~~~~~\n");return true;
}
bool QMCY_APP::DestroyEPOLL()
{if (m_epoll_fd > 0 ) {close(m_epoll_fd);}return true;
}

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

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

相关文章

深入理解Flink IntervalJoin源码

IntervalJoin基于connect实现&#xff0c;期间会生成对应的IntervalJoinOperator。 PublicEvolving public <OUT> SingleOutputStreamOperator<OUT> process(ProcessJoinFunction<IN1, IN2, OUT> processJoinFunction,TypeInformation<OUT> outputTyp…

​可视化绘图技巧100篇进阶篇(四)-三维簇状柱形图(3D Clustered Bar Chart)

目录 前言 适用场景 图例 柱形图 一、柱形图的特点 二、柱形图的类型

2021年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:输出整数部分 输入一个双精度浮点数f, 输出其整数部分。 时间限制:1000 内存限制:65536 输入 一个双精度浮点数f(0 < f < 100000000)。 输出 一个整数,表示浮点数的整数部分。 样例输入 3.8889 样例输出 3 下面是一个使用C语言编写的输出双精度浮点数整数部分…

HTML详解连载(1)

HTML详解连载&#xff08;1&#xff09; HTML定义HTML 超文本标记语言标签语法注意拓展 HTML基本骨架解释VS Code 快速生成骨架&#xff1a;标签的关系父子关系&#xff08;嵌套关系&#xff09;兄弟关系&#xff08;并列关系&#xff09; 代码格式注释 标题标签标签名:h1-h6(双…

csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表

一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证&#xff0c;我只要把csrf的这个中间件打开&#xff0c; 那就意味着所有的方法都要被验证 在所有的视图函数中&#xff1a;只有几个视图函数做验证只有几个函数…

制造业企业数字化转型之设备数据采集

导 读 ( 文/ 1894 ) 随着信息技术的快速发展和制造业的转型升级&#xff0c;企业数字化转型已成为保持竞争力和实现可持续发展的关键。在数字化转型过程中&#xff0c;设备数据采集作为重要的一环&#xff0c;发挥着关键的作用。设备数据采集通过收集、分析和利用设备所产生的数…

【资讯速递】AI与人类思维的融合;OpenAI在中国申请注册“GPT-5”商标;移动大模型主要面向to B 智能算力是未来方向

2023年8月11日 星期五 癸卯年六月廿五 第000001号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…

Effective Java笔记(28)列表优于数组

数组与泛型相比&#xff0c;有两个重要的不同点 。 首先&#xff0c;数组是协变的&#xff08; covariant &#xff09; 。 这个词听起来有点吓人&#xff0c;其实只是表示如果 Sub 为 Super 的子类型&#xff0c;那么数组类型 Sub[ ]就是Super[ ]的子类型。 相反&#xff0c;泛…

无涯教程-Perl - link函数

描述 此函数创建一个新文件名NEWFILE,链接到文件OLDFILE。该函数创建一个硬链接&#xff1b;如果需要符号链接,请使用符号链接功能。 语法 以下是此函数的简单语法- link OLDFILE,NEWFILE返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例…

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

目录 往期文章传送门 一、控制流 &#xff08;Control Flow&#xff09;和 Trap 二、Exceptions, Traps, and Interrupts Contained Trap Requested Trap Invisible Trap Fatal Trap 异常和中断的异同 三、RISC-V的异常处理 mtvec&#xff08;Machine Trap-Vector Ba…

从零学算法154

154.已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,4] 若旋转 7 次&#…

前端必学的CSS3波浪效果演示

以下是这三种CSS3波浪效果的使用说明 使用translateX和translateZ属性创建波浪效果&#xff1a; 使用场景&#xff1a; 适用于需要在X轴上平移和在Z轴上应用3D变换的波浪效果。可以用于创建具有起伏效果的海浪、水面波纹等效果。 优点&#xff1a; 通过3D变换&#xff0c;…

内生安全构建数据存储

一、数据安全成为防护核心&#xff0c;存储安全防护不容有失 1、数据作为企业的核心资产亟需重点保护&#xff0c;数据安全已成网络空间防护核心 2、国家高度重视关键信息基础设施的数据安全&#xff0c;存储安全已成为审核重点 二、存储安全是数据安全的关键一环&#xff0c;应…

AIGC技术揭秘:探索火热背后的原因与案例

文章目录 什么是AIGC技术&#xff1f;为何AIGC技术如此火热&#xff1f;1. 提高效率与创造力的完美结合2. 拓展应用领域&#xff0c;创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作&#xff1a;生成独特的艺术作品2. 内容创作&#xff1a;实时生成各类内容3. …

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 https://www.swrjzxw.com/1556.html SolidWorks装配体时 显示 不能使用选择如允许此选…

哪些CRM的报价公开且透明?

企业在选型时&#xff0c;会发现很多品牌的CRM系统价格并不透明&#xff0c;往往都是需要跟产品顾问沟通后才能了解。下面推荐一款价格实在的CRM系统&#xff0c;所有报价公开透明&#xff0c;那就是Zoho CRM。 Zoho CRM是什么&#xff1f; Zoho CRM是一款在线CRM软件&#x…

NAS相关

Debian11 更换软件源 备份 #备份软件源列表 cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑sources.list nano /etc/apt/sources.list替换文件内容 deb http://mirrors.163.com/debian/ bullseye main non-free contrib deb http://mirrors.163.com/debian/ bull…

SAP BAPI 创建/修改MD61/MD62计划独立需求预测

MD61 创建&#xff1a; BAPI: BAPI_REQUIREMENTS_CREATE CLEAR: lv_error,ls_requirements_item,lt_requirements_schedule_in,ls_requirements_schedule_in,lt_return_n,ls_return_n,lv_reqmtsplannumber."工厂ls_requirements_item-plant lv_werks."MRP AR…

pytorch模型加载caffe模型的权重

一、将caffe模型的权重转成dict格式 caffe库的编译可以参考我之前写的一篇博客&#xff1a;ImportError: dynamic module does not define module export function (PyInit__caffe)问题解决记录_chen_zn95的博客-CSDN博客 安装好后使用以下脚本便可将caffe模型的参数名和参数…

分布式测试插件 pytest-xdist 使用详解

目录 使用背景&#xff1a; 使用前提&#xff1a; 使用快速入门&#xff1a; 使用小结&#xff1a; 使用背景&#xff1a; 大型测试套件&#xff1a;当你的测试套件非常庞大&#xff0c;包含了大量的测试用例时&#xff0c;pytest-xdist可以通过并行执行来加速整体的测试过…