SNMP协议

介绍SNMP知识:SNMP协议、SNMP-trap、SNMP服务、SNMP端口、snmp.exe

« snmp-FAQSNMP OID介绍 »

snmp trap开发实例代码



严正声明:本代码为商业机密,未经允许,严禁转载,否则追究法律责任!

为了简单,需要包含的头文件和数据定义等已经省略。

下面的发送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;
   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"); 
 session.community = (u_char*)trapcommunity;
 session.community_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;
}

测试一下:

int main()
{
 char* str="cpu temprature restored"; 
 send_trap(CPU_TEMPERATURE,str);
 return 0;
}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By SNMP  Windows soft Download MSN中文博客

Copyright http://net-snmp.cn All Rights Reserved.