历史经验之snmp trap代码总结

整理日期: 2009年7月18日

下面的发送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的描述
店铺地址:https://shop66907778.taobao.com/
下面是具体的代码:

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

猜你喜欢

转载自blog.csdn.net/weixin_41486034/article/details/106257802
今日推荐