SNMP陷阱(SNMP Trap)
SNMP陷阱(SNMP Trap)是由一个SNMP代理发送的信息给管理员,其使一个代理通知管理站的重要事件,通过一个未被请求的SNMP信息。在SNMP自陷的通知后面的观点是这样的:如果一个管理员是负责大量的设备,每个设备有大量的目标,这对他是不切实际的或请求信息来自每个设备中的每个目标。每个在管理设备上的代理的解决方案在没有请求的情况下通知管理员。它通过发送信息叫做这个事件的陷阱。在接收到这个事件之后,管理员配置它和可能选择基于这个事件的行动。举例来说,管理员能够直接轮询这个代理,或轮询其它相关设备代理来获得对这个事件更好的理解。
什么是snmp trap?
原始的SNMP管理器是一个查询程序,需要不断的检查SNMP设备的状态。就是SNMP设备状态不变,也要不断检查。自然浪费了很多资源、带宽。
SNMP TRAP就是在SNMP设备发生状态变化的时候向管理器发出信号。不用管理器来检查。

相当于计算机中的查询方式和中断方式。
SNMP TRAP报文从agent发给managerTrap 报文可以指示一个错误或危险状态,或者通知manager agent的状态。SNMP manager必须正确解码这一TRAP 报文,并处里结果数据。
关于其开发代码可以参见本站其他文章
snmp trap开发实例代码
严正声明:本代码为商业机密,未经允许,严禁转载,否则追究法律责任!作者qq:277306580,可添加交流(验证请写明snmp)
为了简单,需要包含的头文件和数据定义等已经省略。
下面的发送snmp trap的代码主要由两个接口实现:
int write_trap( int trap_type,
   int specific_type,
   oid *oid_name,
   size_t oid_length,
          char *TrapDescription,
          netsnmp_session *session)
int send_trap(int Specific_Type,char* TrapDescription)
系统中通过调用该接口来发送trap.该接口调用write_trap这个接口。
//参数说明:
//Specific_Type:trap类型,由自己定义,如cpu温度、风扇转速等
//TrapDescription:trap的描述
下面是具体的代码:
int write_NAS_trap( int trap_type,
   int specific_type,
   oid *oid_name,
   size_t oid_length,
          char *TrapDescription,
          netsnmp_session *session)
{
    netsnmp_session *ss;
 netsnmp_pdu    *pdu;
    int            status; 
    int error = TRAP_ERR_NOERR;
    netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DEFAULT_PORT,
        SNMP_TRAP_PORT);
    ss = snmp_open(session);
    if (ss == NULL)
    {
       return TRAP_ERR_SESSION;
    }   
 //snmpv2trap
    long sysuptime;
    char csysuptime[20];
 pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
 sysuptime = get_uptime();
 sprintf(csysuptime, "%ld", sysuptime);
 error=snmp_add_var(pdu, oid_sysuptime,sizeof(oid_sysuptime) / sizeof(oid), 't', csysuptime);
 if(error!=0)
   {
        return TRAP_ERR_SENDTRAP;
    } 
    if (error=snmp_add_var(pdu, oid_name, oid_length, 's',
        TrapDescription) != 0)
    { 
        return TRAP_ERR_SENDTRAP;
    }
    status = snmp_send(ss, pdu) == 0;
    if (status)
    { 
       snmp_free_pdu(pdu);
       return TRAP_ERR_SENDTRAP;
    }
    snmp_close(ss);
    return TRAP_ERR_NOERR;
}
int send_trap(int Specific_Type,char* TrapDescription)
{
 oid *SAN_trap_oid;
 size_t SAN_trap_oid_length;
 int trap_err = TRAP_ERR_NOERR;
 int TrapType = SNMP_TRAP_ENTERPRISESPECIFIC;
 char message[400];
 memset(message,0,400);
 int crl = HBC_getSlot() - HBC_SLOT0;
 sprintf(message, " controller %d send: ",crl);
 if (strlen(TrapDescription) + strlen(message) > 400 || TrapDescription==NULL || strlen(TrapDescription)==0)
 {
  return TRAP_ERR_BADDESCRIPTIONLENGTH;
 }
 strcat(message, TrapDescription);
 /*if(TrapDescription==NULL || strlen(TrapDescription)>MAX_DESCRIPTION_LENGTH || strlen(TrapDescription)==0)
 {
  return TRAP_ERR_BADDESCRIPTIONLENGTH;
 }*/
 
 switch(Specific_Type)
 {
  case TEST_TRAP: //测试用
   SAN_trap_oid=oid_test; //oid 由自己定义
   SAN_trap_oid_length=sizeof(oid_test)/sizeof(oid);
   break;
  case ALARM_FAN_EMBED:
   SAN_trap_oid=oid_Fan_Speed;
sizeof是什么   SAN_trap_oid_length=sizeof(oid_Fan_Speed)/sizeof(oid);
   break;
   
  ......//后面还有好多需要发送trap事件省略,都是一样的格式
  default:
   return TRAP_ERR_BADTRAPTYPE;   
 }
   
 // init session
 netsnmp_session session;
 snmp_sess_init(&session);
 session.version = SNMP_VERSION_2c;
 char* trapcommunity=strdup("public"); 
 sessionmunity = (u_char*)trapcommunity;
 sessionmunity_len = strlen(trapcommunity);
 
 int iret; 
 SNMPCONF snmpConf;
 /****/
 iret = GetServiceConf_trap(SRV_NETSNMP,&snmpConf); //还接口是获取需要接受trap的目的ip,可以根据情况自己编写
 if(iret!= SRV_GET_SERVICE_CONF)
 {
 // printf("iret(libNASTrap)=%d\n",iret); 
  return TRAP_ERR_GETRECEIVERFAILED;
 }
 /******/
 if(!snmpConf.bTrapEnable)
 {
  return TRAP_ERR_DISABLETRAP;
 } 
 if(snmpConf.sTrapIP==NULL || strlen(snmpConf.sTrapIP)==0)
 {
  return TRAP_ERR_BADTRAPRECIEVER;
 } 
 int count=0;
 char** IPAddress=NULL;
 char* sTraprReceiverAddress = (char*)malloc(sizeof(char)*(strlen(snmpConf.sTrapIP)+1));
 strcpy(sTraprReceiverAddress,snmpConf.sTrapIP);
 iret=ParseIPAddress(sTraprReceiverAddress,SEPARATOR,&IPAddress,&count); 
 free(sTraprReceiverAddress);
 if(iret!=PARSEIPADDRESS_ERR_NOERR)
 {
  return iret;
 } 
 int i,j;
 for(i=0; i<count;i++)
 {
  int kk=0;
  char** IPSep=NULL;
  int ierror = StringSplitter(IPAddress[i],'.',&IPSep,&kk);
 
  if(ierror!=PARSEIPADDRESS_ERR_NOERR || IPSep==NULL || kk!=4 )
  {
   return TRAP_ERR_BADTRAPRECIEVER;
  }
  int ipadd[4];
  for(j=0;j<kk;j++)
  {
   
   ipadd[j]=atoi(IPSep[j]);
   
  }
  sprintf(IPAddress[i],"%d.%d.%d.%d",ipadd[0],ipadd[1],ipadd[2],ipadd[3]);
  for(j=0;j<kk;j++)
  {
   free(IPSep[j]);
  } 
  free(IPSep);   
  session.peername=IPAddress[i]; 
  trap_err=write_trap(TrapType,Specific_Type,SAN_trap_oid,SAN_trap_oid_length,message,&session);
  if(trap_err!=TRAP_ERR_NOERR)
  {
   for(j=0;j<count;j++)
   {
    free(IPAddress[j]);
   }
   free(IPAddress);
   return trap_err;
  }
 }
 for(j=0;j<count;j++)
 {
  free(IPAddress[j]);
 }
 free(IPAddress);
 return TRAP_ERR_NOERR;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。