Qt Creator平台编译snmp++

news2024/9/20 7:55:15

声明 :本文的大部分资源参考自文章,编译snmp++的方法我也是在这里学习的,结合自己的需求,做了snmp++和Agent++的混合编译。需要了解更多的详情可以点击链接去看原文,我总结了自己的编译过程,并写下此文作为一个回国笔记,希望能帮助到同样有此需求的人。

文章目录

  • 一 前期准备
  • 二 源码准备
  • 三 配置编译环境
    • (一).工程文件建立
    • (二).将snmp++和Agent++ 源代码复制进来
    • (三).修改工程文件的一些内容
  • 四 漫长的修正bug之路
    • 报错1,“netdb.h:No such file or directory”
    • 报错2,“‘in6_addr’was not declared in this scope”
    • 报错3,“openssl/des.h:No such file or directory”
    • 报错4,“des.h:No such file or directory”
    • 报错5,“undefined reference to ‘_imp_htonl’”
    • 报错6,“undefined reference to ‘des_key_sched’”
  • 五 编译结果
  • 六 注意事项
  • 七 运用编译的库
  • 五 测试代码
  • 链接

一 前期准备

操作系统:win11
qt版本:5.8,QtCreator版本为4.2.1
编译器版本:5.8.0_MinGW_32_bit

二 源码准备

准备snmp++和des和 agent++的源码。snmp++就是实现snmp功能的主要代码,des是用来加密算法,agent++写代理的时候用得着。建议和snmp++一起编译了。
下载地址官网
在这里插入图片描述
下载文件然后解压。绿色框的地方点开是对应的开发文档。右下角有一个agent++的帮助文档,建议需要开发的朋友一并下载了。

三 配置编译环境

(一).工程文件建立

1.新建一个Qt工程文件
1.选择创建c++Library
在这里插入图片描述
2.命名工程,这里命名为snmp_dev
在这里插入图片描述
3.创建共享库,Shared Library
在这里插入图片描述
4.选择编译器为mingw。
在这里插入图片描述

(二).将snmp++和Agent++ 源代码复制进来

1.打开刚才解压后的snmp++和agent++文件夹,分别将下属三部分内容复制
snmp++文件夹目录
Agent++文件夹目录
2.先看看snmp++的include中的内容。可见,snmp__pp文件夹,该文件夹中包含了绝大部分的头文件,将该文件夹(snmp_pp)复制,粘贴至刚创建的snmp_dev工程目录下,Agent++目录的操作也是一样的。
在这里插入图片描述
3.打开snmp++的src文件,可以看见一堆的cpp文件,将该部分所有的cpp文件,复制到snmp_dev工程目录下,Agent++的文件操作也是一样的
在这里插入图片描述
4.此使,snmp_dev工程文件下,可以看见如下的部分内容,有一部分将在后续过程中,再复制进来
![这个已经是我编译过的文件了,所以会有些多的东西](https://i-blog.csdnimg.cn/direct/32c9ec964d234ed684d49865d9662c75.png](https://i-blog.csdnimg.cn/direct/ef94e1e89cbe4fbc9ed930fe41eb3445.png)
5.将所有.h和.cpp文件导入工程中

在这里插入图片描述
6.到这一步,导入就暂时告一段落。

(三).修改工程文件的一些内容

1.刚创建的snmp_dev工程中,同时生成的有snmp_dev.h与snmp_dev.cpp。下面需要修改这两个文件内容。
2.删除snmp_dev.cpp。
3.修改snmp_dev.h头文件,删除部分内容,添加一个include,修改至如图,务必要修改。
在这里插入图片描述
4.至此,就可以点击一下左下角哪个锤子按钮,开始尝试编译了,当然,会有一堆报错,我挨个分析。

四 漫长的修正bug之路

报错1,“netdb.h:No such file or directory”

1.报错:首先出现的报错如图,对应的libsnmp.cpp文件如图所示
在这里插入图片描述
2.分析:从报错位置来看,百度可知,这部分报错的可能原因,猜测是因为该部分头文件再windows中并不存在,是linux中的内容,不管是不是这个原因,可以确定的是,这几个头文件压根就不存在

3.解决:头文件不存在,那就不加载就行了,因此,做如下修改:
在这里插入图片描述

报错2,“‘in6_addr’was not declared in this scope”

1.报错:接着编译,锤子,然后出现新的问题,这次出现再address.cpp中。
在这里插入图片描述
2.分析:分析编译出错的部分的内容,可以猜测,这部分内容是与ipv6相关,关键词搜索宣称的不存在的内容,没找到定义的位置,因此想到,能不能直接不要这部分,因为其实现在我所接触的大部分时候,还用不着IPV6,因此干脆不要了。那如何能让他不编译,看见上面写着ifdef SNMP_PP_IPv6,意思是,如果定义了SNMP_PP_IPv6,就执行下面一部分内容,那直接不定义SNMP_PP_IPv6,不就行了?于是,全局搜索define SNMP_PP_IPv6,果然存在。
在这里插入图片描述
3.解决:将上图中的,红框内的内容,注释掉即可,问题解决

报错3,“openssl/des.h:No such file or directory”

1.报错:这次出问题的是auth_priv.cpp,分析其中内容
在这里插入图片描述
2.分析:由报错的内容分析,可以看出来,这一部分是用来加密用的,这个情况很明显,就是却一个des.h头文件,这个头文件很眼熟,没错,在刚刚下载的两个源代码中,解压了snmp++,而另一个libdes一直还没用上,里面就有一个des.h,那是不是复制过来就行?这并不能解决问题,因为可以看见,即便des.h找到了,后面两个人就不存在,因此,问题的根本在于,是否需要使用openssl,实际上是可以不用这个的。
3.解决:因此,根据ifdef _USE_OPENSSL可知,搜索define _USE_OPENSSL。如下图,注释掉红框内的内容即可。
在这里插入图片描述

报错4,“des.h:No such file or directory”

1.报错:上一步将openssl给禁用了,新的报错出现了。
在这里插入图片描述
2.分析:很明显,就是在将openssl禁用的情况下,这个snmp++有备选方案,备选方案,没错,就是使用libdes,即下载的两个文件,一个snmp++,一个libdes,刚仅仅使用了snmp++,这会将发挥libdes的作用了,在解压libdes后发现,里面有des.h文件。
3.解决:libdes文件夹下,有多个头文件和cpp文件,不晓得需不需要将别的也复制过来,但是,既然报错是des.h文件,那就先解决眼下的问题。复制过来后,编译,这个问题解决了。

报错5,“undefined reference to ‘_imp_htonl’”

报错:这只是第一条,出现的不仅仅这条报错。
在这里插入图片描述
2.分析:上网百度可以发现,缺失的内容都是一个叫ws2_32的库文件,这是提供了对部分网络相关API的支持的,这个库系统中会自带,因此,只需要引入即可。
3.解决:在.pro文件中添加 LIBS += -lws2_32,问题解决。
在这里插入图片描述

报错6,“undefined reference to ‘des_key_sched’”

1.报错:又出现新的报错。
在这里插入图片描述
2.分析:undefined,意思肯定是缺少了一些库文件或者什么内容的调用。再观察到缺少的东西的名字,里面有一个des的字眼,猜测估计就是缺少了libdes文件夹下的内容

3.解决:不知道缺的是哪个,一不做二不休,把libdes下的所有.h和.c都复制过来,编译,问题果然解决。
在这里插入图片描述

五 编译结果

1.查看编译生成的内容
在这里插入图片描述
图中点选即生成的内容,.a和.dll库文件,即开发所需的.a文件,和运行过程中需要的.dll文件。

六 注意事项

1.一定要搞清楚头文件和cpp文件等存放的位置,报错各个头文件的拓扑关系,这在后续的库文件的使用中,尤其重要。

2.编译过程中,缺什么别慌,冷静分析,看能不能找不到,同时也得注意看代码,分析是否可以跳过该部分内容。

3.注意关注点,生成库文件的工程文件,比如我所用的例子中的,snmp_dev.h和snmp_dev.cpp文件,一定记得删除cpp文件,然后在.h文件中,将原来的内容全清空了,主要指的是原有的class等内容,只需要引入#include snmp/snmp_pp.h即可。如原有的class等内容不清空,编译中虽然不报错,但是编译出的.a文件就是空文件,无法使用。

4.编译结果的.a和.dll文件,区别在于.a是程序编译生成所需,.dll是程序运行所需的。

七 运用编译的库

1搞清楚我们有什么库文件以及放在哪
动态库文件。有两个,一个是snmp_dev.a,一个是snmp_dev.dll,以及相应的头文件。我们将这两个库文件放在同一个文件夹下,比如创建一个名为lib的文件夹。将该文件夹放置在需调用snmp功能的工程文件的目录下。同时,创建一个名为include的文件夹,将头文件放进该文件夹下,将include文件夹也放置在该工程目录下。snmp_dev.a是为了编译使用,snmp_dev.dll是为了程序运行使用,没有.dll库文件,exe文件无法运行。因此在发布时,需要将snmp_dev.dll文件复制到与exe同个目录下。
在这里插入图片描述
include的文件夹下的文件
在这里插入图片描述
lib文件夹下面的文件
在这里插入图片描述
2 库文件及头文件的导入
在这里插入图片描述
3.选择 外部库
在这里插入图片描述
4.动态库的导入如下选择,勾选动态
在这里插入图片描述

五 测试代码

服务器的代码

#include <QCoreApplication>
#include<snmp_dev.h>
#include<snmp_pp/snmp_pp.h>
#include<snmp_pp/oid.h>
#include <winsock2.h>

using namespace  std;
using namespace  Snmp_pp;


//#pragma comment(lib, "ws2_32.lib")

#define SYSDESCR      "1.3.6.1.2.1.1.1.0"        //ObjectID for system descriptor
#define SYSOBJECTID   "1.3.6.1.2.1.1.2.0"        //ObjectID for system object ID
#define SYSCONTACT    "1.3.6.1.2.1.1.4.0"        //ObjectID for system contact
#define coldStart     "1.3.6.1.6.3.1.1.5.1"
#define ZYX1          "1.3.6.1.2.1.1.1.1"
#define ZYX2          "1.3.6.1.2.1.1.1.2"
#define ZYX3          "1.3.6.1.2.1.1.1.101"
using namespace  std;
using namespace  Snmp_pp;


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Snmp::socket_startup();  //初始化socket子系统

    int status;
    Vb vb[3];
    Pdu pdu;
    vb[0].set_oid(SYSDESCR);
    vb[1].set_oid(ZYX1);
    vb[2].set_oid(ZYX3);
    pdu.set_vblist(vb,3);
    CTarget ctarget((IpAddress) "127.0.0.1");  //被管代理的ip
    Snmp snmp(status);
    if((status=snmp.get(pdu, ctarget))!=SNMP_CLASS_SUCCESS)
    {
        cout<<snmp.error_msg(status);
    }
    else
    {
        pdu.get_vblist(vb,3);
        for(int i=0;i<3;i++)
        {
            cout<<"oid:"<<vb[i].get_printable_oid()<<" "<<"value:"<<vb[i].get_printable_value()<<endl;
        }

    }

    return a.exec();
}

代理的代码

#include <QCoreApplication>
#include "agent_dev.h"
#include "agent_dev_global.h"
#include<snmp_pp/snmp_pp.h>
#include<agent_pp/agent++.h>
#include<agent_pp/mib.h>
#include<agent_pp/mib_entry.h>
#include<agent_pp/request.h>
#include<QDebug>
#include<agent_pp/snmp_group.h>
#include<agent_pp/system_group.h>
#include <agent_pp/snmp_target_mib.h>
#include <agent_pp/snmp_notification_mib.h>
#include"qagent.h"
using namespace std;
using namespace  Snmp_pp;
using namespace Agentpp;

#define SYSDESCR      "1.3.6.1.2.1.1.1.0"        //ObjectID for system descriptor
#define SYSOBJECTID   "1.3.6.1.2.1.1.2.0"        //ObjectID for system object ID
#define SYSCONTACT    "1.3.6.1.2.1.1.4.0"        //ObjectID for system contact
#define coldStart     "1.3.6.1.6.3.1.1.5.1"
#define ZYX1          "1.3.6.1.2.1.1.1"
#define ZYX2          "1.3.6.1.2.1.1.2"
#define ZYX3          "1.3.6.1.2.1.1.101"
bool run = true;
static void sig(int signo)
{
    if ((signo == SIGTERM) || (signo == SIGINT) ||(signo == SIGSEGV))
    {
        printf ("\n");
        switch (signo)
        {
        case SIGSEGV:
        {
            qDebug()<<"Segmentation fault, aborting.";
            exit(1);
        }
        case SIGTERM:
        case SIGINT:
        {
            if (run)
            {
                qDebug()<<"User abort";
                run = false;
            }
        }
        }
    }
}

void init_signals()
{
    signal (SIGTERM, sig);
    signal (SIGINT, sig);
    signal (SIGSEGV, sig);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Snmp::socket_startup();
    int status;
    unsigned short port = 161; //161为监听端口 162为Trap端口
    UdpAddress address("127.0.0.1");
     address.set_port(port);
    Snmpx snmp(status,address);
    if( SNMP_CLASS_SUCCESS == status)
    {
       Mib mib;
       //将oid 和对应的value放入这个Mib里面,等请求到到来的时候 代理会在这个Mib里面查询相应的信息来处理
       mib.add(new snmpGroup());
       mib.add(new snmp_target_mib());
       mib.add(new snmp_notification_mib());
       mib.add(new MibLeaf("1.3.6.1.2.1.1.1.0", READONLY, new OctetStr("SYSDESCR")));
       mib.add(new MibLeaf("1.3.6.1.2.1.1.1.1", READONLY, new OctetStr("zyx1")));
       mib.add(new MibLeaf("1.3.6.1.2.1.1.1.2", READONLY, new OctetStr("zyx2")));
       mib.add(new MibLeaf("1.3.6.1.2.1.1.1.101", READWRITE, new OctetStr("zyx3")));

        //创建RequestList
        RequestList* reqList = new RequestList(&mib);

        mib.set_request_list(reqList);

        init_signals();

        reqList->set_snmp(&snmp);

        mib.init(); //mib 初始化
        //监听循环 此处循环何时退出可根据实际情况来做修改
        Request* req;
        while (run)
        {
            req = reqList->receive(5);
            if (req)
            {
                mib.process_request(req);//对请求进行处理,请求包括get,getNext,getBulk,walk,set。
            }
            else
            {
                mib.cleanup();
            }
        }
        delete reqList;
        Snmp::socket_cleanup();
    }
    else
    {
        qDebug()<<"snmp port init failed!";
    }
    return a.exec();
}

我们先运行代理,开始监听请求,如下:
在这里插入图片描述
然后我们运行 服务器,发起get请求。
在这里插入图片描述
get之后获得得数据都打印了出来,oid和value对应。get时的iod一定是代理里面的Mib添加了的,存在的oid.

链接

接下来,我将对snmp里面的getgetNextgetBulksettrapinform这六种操作进行一一的讲解。
1.snm++操作之get
2.snmp++操作之getNext
3.snmp++操作之getBulk
4.snmp++操作之walk
5.snmp++操作之set
6.snmp++操作之trap
7.snmp++操作之阻塞式inform
8.snm++操作之异步inform

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

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

相关文章

Springboot+vue自制可爱英语日记系统-XD动画测试版

目录 项目背景与愿景 项目流程 需求分析 设计之美 技术实现 部署策略 未来展望 项目寄语 项目预览 项目页面展现 引导页(3张) 首页 日记模块 日记模块-写日记 信箱模块 回收箱模块 前端开发 前端开发概述 关键技术选型 开发流程 后端开发 后端开发概述 …

【算法/训练】:动态规划

一、路径类 1. 字母收集 思路&#xff1a; 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数&#xff0c;由于只能往下和往右走&#xff0c;因此走到&#xff08;i&#xff0c;j&#xff09;的位置要就是从&#xff08;i - 1&#xff0c; j&#xff09;往下走&#x…

C++笔记3:基类指针delete子类对象的内存泄漏问题

根据《effective C》第7章所述&#xff0c;new的一个子类对象赋值给基类指针delete的时候为了防止子类的析构函数没有调用要在基类的析构函数加上virtual 关键字&#xff1a; #include <stdint.h> #include <iostream> #include <iomanip> #include <vec…

零代码实现GIS视效提升,一键添加体积云体积雾

在三维GIS开发中&#xff0c;场景的真实感和高效性始终是用户的核心需求。为此&#xff0c;山海鲸可视化提供了完美的解决方案。这款免费可视化工具不仅支持多种GIS影像协议&#xff08;TMS、WMS、WMTS等&#xff09;&#xff0c;还可以一键添加体积云和体积雾效果&#xff0c;…

FastGPT 知识库搜索测试功能解析(一)

本文以 FastGPT 知识库的搜索测试功能为入口,分析 FastGPT 的知识检索流程。 一、搜索功能介绍 1.1 整体介绍 搜索测试功能包含三种类型:语义检索、全文检索、混合检索。 语义检索:使用向量进行文本相关性查询,即调用向量数据库根据向量的相似性检索; 全文检索:使用…

Axure软件新功能解析与应用技巧分享

Axure是一种用于创建原型和交互设计的软件工具&#xff0c;广泛应用于操作界面。&#xff08;UI&#xff09;和客户体验&#xff08;UX&#xff09;为了展示和测试应用程序、网站或其他数据产品的性能和操作界面&#xff0c;设计帮助产品经理、设计师和开发者制作具有交互性的原…

17.jdk源码阅读之LinkedBlockingQueue

1. 写在前面 LinkedBlockingQueue 是 Java 并发包中的一个重要类&#xff0c;常用于生产者-消费者模式等多线程编程场景。上篇文章我们介绍了ArrayBlockingQueue&#xff0c;并且与LinkedBlockingQueue做了简单的对比&#xff0c;这篇文章我们来详细分析下LinkedBlockingQueue…

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误&#xff0c;在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot&#xff0c;it is reported as a ‘one-time polle…

一文弄懂JVM类加载器与双亲委派机制

类的加载器完成类的加载环节中的装载阶段的工作&#xff08;通过一个类的全限定名来获取该类的二进制字节流&#xff0c;且这个动作在虚拟机**外部实现**&#xff0c;即开发者可以决定如何去获取所需的类&#xff09;&#xff0c;且**不会影响后续的链接和初始化阶段&#xff0…

《算法笔记》总结No.10——链表

从第10期破例插叙一期单链表的实现&#xff0c;这个东东相当重要&#xff01;考研的同学也可以看&#xff1a;相较于王道考研的伪码不太相同&#xff0c;专注于可以运行。如果是笔试中的伪码&#xff0c;意思正确即可~ 注&#xff1a;博主之前写过一个版本的顺序表和单链表的C实…

谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成

文章目录 一&#xff0c;56-商品服务-API-三级分类-修改-拖拽功能完成二&#xff0c;57-商品服务-API-三级分类-修改-批量拖拽效果1&#xff0c;增加按钮2&#xff0c;多次拖拽一次保存完整代码 在构建商品服务API中的三级分类修改功能时&#xff0c;拖拽排序是一个直观且高效的…

Linux:Linux权限

目录 1. Linux权限的概念 2. Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 2.2.1 文件类型 2.2.2 基本权限 2.3 文件权限值的表示方法 2.4 文件访问权限的相关设置方法 2.4.1 chmod 2.4.2 chown 2.4.3 chgrp 2.4.4 umask 3. file指令 4. Linux目…

如何学习EMR:糙快猛的大数据之路(建立整体框架)

目录 初学EMREMR是什么&#xff1f;我的EMR学习故事糙快猛学习法则代码示例: 你的第一个EMR任务学习EMR的深入步骤EMR进阶技巧实用资源推荐常见挑战和解决方案 EMR生态EMR生态系统深度探索1. EMR上的Hadoop生态系统2. EMR Studio3. EMR on EKS 高级EMR配置和优化1. EMR实例集策…

音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件

音视频入门基础&#xff1a;PCM专题系列文章&#xff1a; 音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放 音视频入门基础&#xff1a;PCM专题&#xff08;2&#xff09;——使用Qt播放PCM音频文件 音视频入门基础&am…

ICML 2024最佳论文开奖了!今年的热门投稿方向有这些

ICML 2024最近也放榜啦&#xff01;今年共有10篇论文夺得最佳论文奖&#xff0c;包括火爆的Stable Diffusion 3、谷歌VideoPoet以及世界模型Genie。 ICML是国际机器学习顶会&#xff0c;也是CCF-A类学术会议。今年这届顶会一共收到了9473篇论文&#xff0c;其中2610篇被录用&am…

昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐

文章目录 昇思MindSpore应用实践1、MusicGen模型简介残差矢量量化&#xff08;RVQ&#xff09;SoundStreamEncodec 2、生成音乐无提示生成文本提示生成音频提示生成 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、MusicGen模型简…

Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍

文章目录 一、Qt SQL模块概述1.Qt sql 支持的数据库2.SQLite 数据库3.Qt SQL 模块的主要类 一、Qt SQL模块概述 Qt SQL 模块提供数据库编程的支持&#xff0c;Qt 支持多种常见的数据库&#xff0c;如MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块包括多个类&#xff0…

phpstorm配置xdebug3

查看php路径相关信息 php --ini安装xdebug https://www.jetbrains.com/help/phpstorm/2024.1/configuring-xdebug.html?php.debugging.xdebug.configure php.ini 配置 在最后添加&#xff0c;以下是我的配置 [xdebug] zend_extension/opt/homebrew/Cellar/php8.1/8.1.29/p…

安装NVIDIA驱动

一、不升级内核安装NVIDIA驱动 说明: 1、安装NVIDIA驱动,是用来提升AI、图片等算法 2、本人是在centos7.9操作系统安装英伟达T4板卡驱动 操作系统Centos 7.9驱动版本NVIDIA-Linux-x86_64-525.89.02.run操作账号root1.1 关闭nouveau 1、查看nouveau是否关闭 lsmod |grep nouv…

Android 常用调试工具/方法解析

一、内存相关 参考Android内存分析命令_dumpsys meminfo 算出rss-CSDN博客 1、基本概念 1&#xff09;PSS & RSS & USS & VSS a、PSS 概念&#xff1a;全称Proportional Set Size&#xff0c;根据进程实际使用的内存量按照共享比例分配给进程的一种内存度量方…