snmp++操作之trap

news2024/11/14 14:00:32

文章目录

  • snmp六种操作简述
    • Get(获取操作):
    • Get Next(获取下一个操作):
    • Get Bulk(批量获取操作):
    • Set(设置操作):
    • Inform(通知操作):
    • Trap(陷阱操作):
  • trap操作
    • 代理程序
    • 管理程序
  • 注意

snmp六种操作简述

Get(获取操作):

Get 操作用于从管理设备向代理设备获取指定 OID(对象标识符)的值。
管理设备发送 Get 报文包含要获取的 OID 列表,代理设备则根据这些 OID 返回对应的值。

Get Next(获取下一个操作):

Get Next 操作用于从代理设备获取比指定 OID 更大的第一个 OID 的值。
管理设备发送 Get Next 报文包含一个或多个 OID,代理设备则返回比这些 OID 大的第一个 OID 的值。

Get Bulk(批量获取操作):

Get Bulk 操作允许一次获取多个 OID 的值,减少交互次数,提高效率。
管理设备发送 Get Bulk 报文指定起始 OID、请求的个数等参数,代理设备返回相应的值。

Set(设置操作):

Set 操作用于向代理设备设定指定 OID 的值,用于配置设备的参数。
管理设备发送 Set 报文包含要设置的 OID 和对应的值,代理设备根据指定的 OID 进行配置。

Inform(通知操作):

Inform 操作用于向管理设备发送一个通知,通知管理设备某些事件的发生。
代理设备主动发送 Inform 报文给指定的管理设备,通知特定的事件或状态。

Trap(陷阱操作):

Trap 操作用于代理设备向管理设备发送一个告警或事件通知,通知管理设备发生了某些重要的事件。
代理设备可以主动发送 Trap 报文给一个或多个管理设备,告知管理设备设备的状态或发生的事件。
这些操作是 SNMP 协议中常用的几种,用于实现设备间的监控、通知和配置等功能。通过这些操作,网络管理员可以监控网络设备的状态、配置参数、响应事件等,帮助及时发现和解决网络问题

trap操作

1.管理程序开启监听
2.代理程序去对某个oid发起trap操作
3.管理程序监听到trap,并打印

代理程序

#define COLDSTART "1.3.6.1.6.3.1.1.5.1"
#define PAYLOADID "1.3.6.1.4.1.11.2.16.2"
#define PAYLOAD "SNMP++ Trap Send Test"
#define ZYXID "1.3.6.1.4.1.11.2.16.3"
#define ZYX "zyx is so great"

#define ENTERPRISE "1.3.6.1.2.1.1.1.2.0.1"

int main(int argc, char **argv)
{
   Snmp::socket_startup();  // Initialize socket subsystem

   //---------[ make a GenAddress and Oid object to retrieve ]---------------
   UdpAddress address( "127.0.0.1");      // make a SNMP++ Generic address
   if ( !address.valid())
   {           // check validity of address
      cout << "Invalid Address or DNS Name, " << argv[1] << "\n";
   }
   Oid oid( COLDSTART);    // default is ColdStart

   //---------[ determine options to use ]-----------------------------------
   snmp_version version=version2c;                  // default is v2
   u_short port=161;                               // default snmp port is 161
   OctetStr community("public");                   // community name
   Oid ent(ENTERPRISE);                            // default enterprise

   //----------[ create a SNMP++ session ]-----------------------------------
   int status;
   Snmp *snmp = new Snmp(status, "127.0.0.1");

   if ( status != SNMP_CLASS_SUCCESS)
   {
      cout << "SNMP++ Session Create Fail, " << snmp->error_msg(status) << "\n";
      return 1;
   }

   //--------[ build up SNMP++ object needed ]-------------------------------
   Pdu pdu;                               // construct a Pdu object
   Vb vb;                                 // variable binding object to use
   vb.set_oid(PAYLOADID);                 // example oid for trap payload
   vb.set_value(PAYLOAD);                 // example string for payload
   pdu += vb;                              // append the vb to the pdu
   Vb vb2;
   vb2.set_oid(ZYXID);
   vb2.set_value(ZYX);
   pdu += vb2;
   pdu.set_notify_id( oid);               // set the id of the trap
   pdu.set_notify_enterprise( ent);       // set up the enterprise of the trap
   address.set_port(port);
   CTarget ctarget( address);             // make a target using the address

    ctarget.set_version( version);         // set the SNMP version SNMPV1 or V2
    ctarget.set_readcommunity( community); // set the read community name

   //-------[ Send the trap  ]------------------------------------------------
   cout << "SNMP++ Trap to " ;

   cout << " Community=" << community.get_printable() << endl << flush;

   SnmpTarget *target;

    target = &ctarget;

   status = snmp->trap( pdu,*target);
   cout << "SNMP++ Trap Send Status = " << snmp->error_msg( status) << "\n";

  Snmp::socket_cleanup();  // Shut down socket subsystem
}

管理程序

#ifdef SNMP_PP_NAMESPACE
using namespace Snmp_pp;
#endif
using namespace std;


void callback( int reason, Snmp *snmp, Pdu &pdu, SnmpTarget &target, void *cd)
{

    cout<<"callback"<<endl;
    Vb nextVb;
    int pdu_error;
    GenAddress addr;

    target.get_address(addr);
    UdpAddress from(addr);

    if(reason != -7)
    {
        cout << "reason: " << reason << " "<< "msg: " << snmp->error_msg(reason) << " "<< "from: " << from.get_printable() << " ";
    }
    else
    {
         cout << "from: " << from.get_printable() << " ";
    }
    pdu_error = pdu.get_error_status();
    if (pdu_error)
    {
        cout << "Response contains error: "<< snmp->error_msg(pdu_error)<< endl;
    }
    Oid id;
    pdu.get_notify_id(id);
    cout << "ID:  " << id.get_printable() <<endl;
    for (int i=0; i<pdu.get_vb_count(); i++)
    {
        pdu.get_vb(nextVb, i);
        cout << "Oid: " << nextVb.get_printable_oid() << ": "<< "Val: " << nextVb.get_printable_value() << " "<<endl;
    }
    if ( pdu.get_type() == sNMP_PDU_INFORM)//当请求是inform时开始回应
    {
        cout << "pdu type: " << pdu.get_type() << endl;
        cout << "sending response " << endl;
        nextVb.set_value("This is the response.");
        pdu.set_vb(nextVb, 0);
       // sleep(3);
       int status =snmp->response(pdu, target);
       if ( status == SNMP_CLASS_SUCCESS)
       {
            cout<<"success to response";
       }
       else
       {
           cout << "fail to reponse:" << snmp->error_msg(status) << "\n";
       }

    }
    cout <<"--------------------------------------------------" <<endl;
}

int main(int argc, char **argv)
{
  int trap_port= 161; // no need to be root

  //----------[ create a SNMP++ session ]-----------------------------------
  int status;
  Snmp::socket_startup();  // Initialize socket subsystem
  Snmp snmp(status);                // check construction status
  if ( status != SNMP_CLASS_SUCCESS)
  {
    cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "\n";
    return 1;
  }

   OidCollection oidc;
   TargetCollection targetc;

   cout << "Trying to register for traps on port " << trap_port << "." << endl;
   snmp.notify_set_listen_port(trap_port);//设置监听端口
   status = snmp.notify_register(oidc, targetc, callback, NULL);//注册回调函数,当有trap到来时会触发回调函数
   if (status != SNMP_CLASS_SUCCESS)
   {
     cout << "Error register for notify (" << status << "): "<< snmp.error_msg(status) << endl;
     exit(1);
   }
   else
   {
       cout << "Waiting for traps/informs..." << endl;
   }
  snmp.start_poll_thread(1000);

  cout << "press return to stop\n";
  getc(stdin);

  snmp.stop_poll_thread();

  Snmp::socket_cleanup();  // Shut down socket subsystem
}

代理程序运行截图
在这里插入图片描述
管理程序运行截图
在这里插入图片描述
管理程序先启动,开始监听。出现红色框打印字符。当代理程序运行的时候,出现绿色框打印字符

注意

在trap操作中,代理程序发起trap操作。管理程序只需要接受这个操作就行了。是不需要回复代理程序的。如果需要管理程序回复,那个操作应该时inform。

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

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

相关文章

数据建模标准-面向对象建模

前情提要 数据模型定义 DAMA数据治理体系中将数据模型定义为一种文档形式&#xff0c;数据模型是用来将数据需求从业务传递到IT,以及在IT内部从分析师、建模师和架构师到数据库设计人员和开发人员的主要媒介&#xff1b; 作用 记录数据需求和建模过程中产生的数据定义&…

任意空间平面点云旋转投影至水平面—罗德里格旋转公式

1、背景介绍 将三维空间中位于任意平面上的点云数据&#xff0c;通过一系列的坐标变换&#xff08;平移旋转&#xff09;&#xff0c;使其投影到XOY平面上&#xff0c;同时保证点云的几何中心与XOY平面的原点重合&#xff0c;同时点云形状保持不变。具体效果如下&#xff0c;具…

51单片机8(LED闪烁)

一、软件设计&#xff1a; 1、本章所要实现的功能是&#xff1a;点亮D1指示灯&#xff0c;即让P2.0管脚输出一个低电平。完成后可再控制D1指示灯闪烁&#xff0c;即间隔一段时间点亮和熄灭D1指示灯。那么如何让LED进行闪烁&#xff0c;那么只需要循环的让这个低指针先亮一会&a…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日&#xff0c;其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础&#xff0c;提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

地图项目涉及知识点总结

序&#xff1a;最近做了一个在地图上标记点的项目&#xff0c;用户要求是在地图上显示百万量级的标记点&#xff0c;并且地图仍要可用&#xff08;能拖拽&#xff0c;能缩放&#xff09;。调研了不少方法和方案&#xff0c;最终实现了相对流畅的地图系统&#xff0c;加载耗时用…

LLaMA 数据集

LLaMA的训练数据集来源多样&#xff0c;涵盖了多个不同的数据集和预处理步骤。以下是详细的描述&#xff1a; 公开数据来源和预处理 CommonCrawl [67%]&#xff1a; 使用CCNet管道&#xff08;Wenzek等人&#xff0c;2020年&#xff09;对2017年至2020年间的五个CommonCrawl转…

基于 Springboot + vue + java 美食分享平台(美食管理系统)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 &#x1f4ac; 用户表 &#x1f4ac; 美食分享文章表 &#x1f4ac;个人博客表 &#x1f4ac; 美食分类表 &#x1f4ac; …

如何根据项目需求选择采集卡及相关硬件

在选择适合的采集卡和硬件设备时&#xff0c;尤其是在要求高精度的应用场景中&#xff08;如压机测试中的1μm位移计&#xff09;&#xff0c;需要综合考虑多个因素。以下是选择硬件的几个关键原则&#xff1a; 1. 精度要求 对于需要高精度的应用&#xff0c;硬件的精度必须能…

Java代码批量处理sql语句

背景&#xff1a;数据源迁移&#xff0c;目标数据源和原始数据源的语法不同&#xff0c;要把建表语句全都改成新的语法。 一个个sql文件去替换实在是麻烦&#xff0c;可以把原始的sql文件放在一个文件夹&#xff0c;然后用程序一跑&#xff0c;改完语法的sql语句就放在新的文件…

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中&#xff0c;战锤入侵是一个重要的游戏环节&#xff0c;了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧&#xff0c;帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…

miniconda+xinference的大模型推理部署指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

【视觉SLAM】 十四讲ch5习题

1.*寻找一个相机&#xff08;你手机或笔记本的摄像头即可&#xff09;&#xff0c;标定它的内参。你可能会用到标定板&#xff0c;或者自己打印一张标定用的棋盘格。 参考我之前写过的这篇博客&#xff1a;【OpenCV】 相机标定 calibrateCamera Code来源是《学习OpenCV3》18.…

喜报!CACTER实力入选《嘶吼2024网络安全产业图谱》多项领域

CACTER实力入选多项细分领域 7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff0c;旨在全面展示网络安全产业的构成及其重要组成部分&#xff0c;探索网络安全产业的竞争格局和发展前景。 CACTER凭借卓越的技术实力和可靠的产品服务&#…

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2

Add MPI Support for tp-comm-overlap and Cpu-Offload for Mcore Distrib… by jerryli1981 Pull Request #283 alibaba/Pai-Megatron-Patch GitHub 以上是在 llama-70B 上实现的 cpu-offload 方法。 下面是在主分支上&#xff0c;仿照 LLaMA-70B&#xff0c;在 Qwen2 上…

手把手教你搭建Docker私有仓库Harbor

1、什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Docker Hub不同&#xff0c;私有仓库是受限访问的&#xff0c;只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部署…

HarmonyOS工程目录结构

应用级配置文件app.json5 应用唯一标识、版本号、应用图标、应用名称等信息 模块级配置文件module.json5 oh-package.json5 三方库的管理 其他配置 用于编译构建&#xff0c;包括构建配置文件、编译构建任务脚本、混淆规则文件、依赖的共享包信息等。 build-profile.json…

Java学习Day9之数据库链接java

package aboutdb1; import java.sql.*; import java.util.Scanner; public class newDBsystem {private static Connection getConnection() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver"); // 加载MySQL JDBC驱动Connection con DriverManager.get…

阿尔泰科技工业电脑IPC-8363工控机

概述&#xff1a; IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存&#xff0c;最大可扩展至128GB。 主要技术指标&#xff1a; 产品图示&#xff1a; 系…

php 小白新手从入门到精通教程(第3版)

前言 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&#xff0c;并根…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑&#xff0c;输入框能提示相关项。 主要借助qt的QCompleter 类&#xff08; Qt 框架中提供的一个用于自动补全和模糊搜索的类&#xff09;&#xff0c;结合一些控件&#xff0c;比如QComboBox和QLineEdit&#xff0c;实现模糊查询的功能。 1&…