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

通过 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;
}

相关文章:

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

项目需求是 程序上 同时配置了多个服务端 设备 每隔一段时间需要 比如1分钟 连一下服务器看下是否连通 并将结果上报给平台 原来是用线程池来做的 具体大概就是 定时器到了之后 遍历设备列表 找到设备之后 通过 socket连接 发送一个指令 等待服务器返回 用来检查是…...

JavaScript数据结构【进阶】

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 使用 splice() 添加元素使用 slice() 复制数组元素使用展开运算符复制数组使用展开运算符合并数组使用 indexOf() 检查元素是否存在使用 for 循环遍历数组中的全部元素创建复杂的多维数组将键值对添加到对象…...

jQuery编程学习3(jQuery 其他方法: jQuery 拷贝对象、 jQuery 多库共存、jQuery 插件)

目录 jQuery 其他方法 1. jQuery 拷贝对象 $.extend()方法 2. jQuery 多库共存 问题概述&#xff1a; 客观需求&#xff1a; jQuery 解决方案&#xff1a;&#xff08;两种方式&#xff09; 3. jQuery 插件 jQuery 插件常用的网站&#xff1a; jQuery 插件使用步骤&…...

jvm——垃圾回收机制(GC)详解

开始之前有几个GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间…...

计算机组成原理-笔记-第七章

目录 七、第七章——输入输出系统 1、IO设备与IO控制方式 &#xff08;1&#xff09;控制方式&#xff08;查询&#xff0c;中断&#xff0c;DMA&#xff09; &#xff08;2&#xff09;通道控制 &#xff08;3&#xff09;IO系统 &#xff08;4&#xff09;总结 2、外设…...

【Linux】网络基础2

文章目录 网络基础21. 应用层1.1 协议1.2 HTTP 协议1.2.1 URL1.2.2 urlencode和urldecode1.2.3 HTTP协议格式1.2.4 HTTP的方法1.2.5 HTTP的状态码1.2.6 HTTP 常见的header1.2.7 最简单的HTTP服务器 2. 传输层2.1 端口号2.1.1 端口号范围划分2.1.2 认识知名端口号2.1.3 netstat2…...

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

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

架构设计第八讲:架构 - 理解架构的模式2 (重点)

架构设计第八讲&#xff1a;架构 - 理解架构的模式2 (重点) 本文是架构设计第8讲&#xff1a;架构 - 理解架构的模式2&#xff0c;整理自朱晔的互联网架构实践心得, 他是结合了 微软给出的云架构的一些模式的基础上加入他自己的理解来总结互联网架构中具体的一些模式。我在此基…...

Java中的Maven Shade插件是什么?

Maven Shade插件是一个非常有用的Maven插件&#xff0c;它可以帮助你在构建项目时打包所有依赖项&#xff0c;并将其打包到一个单独的JAR文件中。这对于在构建过程中使用多个依赖项的项目非常有用&#xff0c;因为它可以让你避免在每个依赖项中都包含所有依赖项&#xff0c;从而…...

ffmpeg的bpp是什么?

例如&#xff1a; AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... AV_PIX_FMT_BGR24, …...

【C# 基础精讲】类和对象的概念

在面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;中&#xff0c;类和对象是两个核心概念&#xff0c;用于描述和实现现实世界中的实体和关系。OOP 是一种编程范式&#xff0c;通过将数据和操作封装为对象来组织和管理代码&#xff0c;使得代…...

微信ipad实现批量添加联系人及批量分组

GEWE框架官方网站 geweapi.com 点击访问即可 搜索 小提示&#xff1a; 添加联系人必要接口搜索返回的V3 V4用于添加联系人 请求URL&#xff1a; http://域名地址/api/contacts/search 请求方式&#xff1a; POST 请求头&#xff1a; Content-Type&#xff1a;application/…...

Highcharts引入

Highcharts是和jQuery一起使用的&#xff0c;所以需要下载好jQuery jQuery下载方式&#xff1a;访问&#xff1a;http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js&#xff0c;然后全选复制到自己新建的txt文档中&#xff0c;最后把扩展名改为js。 Highcharts下载方式&…...

腾讯云轻量和CVM有什么区别?不都是服务器吗?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…...

Android高通8.1 Selinux问题

1、最近客户提了一个需求&#xff0c;说要在user版本上面切分辨率&#xff0c;默认屏幕分辨率是2.5 k 执行adb shell指令之后变成 4k 然后adb shell wm size可以查看 2、一开始我能想到就是在文件节点添加权限&#xff0c;这里不管是mtk还是qcom&#xff08;高通平台&#xff…...

python图片爬虫

#!/usr/bin/env python # -*- coding:utf-8 -*- import argparse import os import re import sys import urllib import json import socket import urllib.request import urllib.parse import urllib.error # 设置超时 import timetimeout 5 socket.setdefaulttimeout(time…...

SpringBoot系列---【SpringBoot在多个profiles环境中自由切换】

SpringBoot在多个profiles环境中自由切换 1.在resource目录下新建dev&#xff0c;prod两个目录&#xff0c;并分别把dev环境的配置文件和prod环境的配置文件放到对应目录下&#xff0c;可以在配置文件中指定激活的配置文件&#xff0c;也可以默认不指定。 2.在pom.xml中最后位置…...

Transformer架构

Transformer架构是一种重要的神经网络模型架构&#xff0c;最初由Vaswani等人在2017年提出&#xff0c;并在机器翻译任务上取得了显著的性能提升。Transformer架构在自然语言处理领域得到广泛应用&#xff0c;特别是在语言模型、机器翻译和文本生成等任务中。 Transformer架构…...

TVS二极管失效分析

摘要&#xff1a;常用电路保护器件的主要失效模式为短路&#xff0c;瞬变电压抑制器(TvS)亦不例外。TvS 一旦发生短路失效&#xff0c;释放出的高能量常常会将保护的电子设备损坏&#xff0e;这是 TvS 生产厂家和使用方都想极力减少或避免的情况。通过对 TVS 筛选和使用短路失效…...

k8s --pod详解

目录 一、Pod基础概念 1、pod简介 2、在Kubrenetes集群中Pod有如下两种使用方式 3、pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;存储 4、kubernetes中的pause容器主要为每个容器提供…...

Spark流水线+Gravitino+Marquez数据血缘采集

1.Openlinage和Marquez简介 1.1 OpenLineage 概述 OpenLineage 是一个开放标准和框架&#xff0c;用于跨工具、平台和系统捕获数据血缘信息。它定义了通用的数据血缘模型和API&#xff0c;允许不同的数据处理工具&#xff08;如ETL、调度器、数据仓库&#xff09;以标准化格…...

Go语言--语法基础5--基本数据类型--输入输出(1)

I : input 输入操作 格式化输入 scanf O &#xff1a; output 输出操作 格式化输出 printf 标准输入 》键盘设备 》 Stdin 标准输出 》显示器终端 》 Stdout 异常输出 》显示器终端 》 Stderr 1 、输入语句 Go 语言的标准输出流在打印到屏幕时有些参数跟别的语言…...

layer norm和 rms norm 对比

Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点&#xff1a; 减去均值&#xff08;去中心化&#xff09;除以标准差&#xff08;标准化&#xff09;包含可学习参数 …...

PicSharp(图片压缩工具) v1.1.6

PicSharp 一个简单、高效、灵活的跨平台桌面图像压缩应用程序。软件基于Rust实现&#xff0c;高性能低资源&#xff0c;能快速扫描文件或目录&#xff0c;批处理图像。软件还具备组合压缩策略&#xff0c;TinyPNG提供最佳压缩比&#xff0c;但需要互联网连接&#xff0c;对大量…...

natapp 内网穿透失败

连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...

深入解析CI/CD开发流程

引言&#xff1a;主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署&#xff0c;但是自己不是太了解什么意思&#xff0c;所以就自己查了一下ci/cd相关的资料&#xff0c;整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写&#xff0c;旨在简化并…...

嵌入式里的时间魔法:RTC 与 BKP 深度拆解

文章目录 RTC实时时钟与BKPUnix时间戳UTC/GMT时间戳转换时间戳转换BKP简介BKP基本结构1. 电池供电模块&#xff08;VBAT 输入&#xff09;2. 侵入检测模块&#xff08;TAMPER 输入&#xff09;3. 时钟输出模块&#xff08;RTC 输出&#xff09;4. 内部寄存器组 RTC简介RTC时钟源…...

模拟法解题的思路与算法分享

我们先来看思路与算法&#xff1a; 使用变长数组对栈进行模拟。 如果操作是 &#xff0c;那么访问数组的后两个得分&#xff0c;将两个得分之和加到总得分&#xff0c;并且将两个得分之和入栈。如果操作是 D&#xff0c;那么访问数组的最后一个得分&#xff0c;将得分乘以 2 …...

Codeforces Round 509 (Div. 2) C. Coffee Break

题目大意&#xff1a; 给你n、m、d n为元素个数,m为数列长度,d为每个元素之间的最短间隔 问最少需要多少个数列可以使得元素都能装进数列&#xff0c;并且满足每个元素之间的间隔大于等于d 核心思想 使用贪心的思想&#xff0c;将元素的大小进行排序&#xff0c;问题出在必…...

提高Python编程效率的工具推荐

在 Python 开发中&#xff0c;选择合适的工具可以显著提升编程效率。以下是一些经过精心挑选的工具&#xff0c;涵盖代码编辑、调试、数据分析等多个方面&#xff0c;希望能帮助你在 Python 开发中事半功倍。 一、集成开发环境&#xff08;IDE&#xff09; 1. PyCharm PyCha…...