📄 snmptrap.c
字号:
#include "VxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "taskLib.h"
#include "msgQLib.h"
#include "stdioLib.h"
#include "strLib.h"
#include "ioLib.h"
#include "fioLib.h"
#include "snmp.h"
extern MSG_Q_ID trap_rx;
char trapdata[4096];
struct sockaddr_in nmsAddr;
int nmsFd;
int snmpTrap()
{
struct sockaddr_in serverSock; //服务器socket地址
int sockAddrSize; /*socket地址的数据结构大小*/
u_long count = 0;
//printf("\n<<_TRAP>> SNMP Trap start!!!!!!!!");
sockAddrSize = sizeof(struct sockaddr_in);
bzero((char *)&serverSock,sockAddrSize);
serverSock.sin_family = AF_INET;
serverSock.sin_len = (u_char)sockAddrSize;
serverSock.sin_port = htons(SNMP_TRAP);
serverSock.sin_addr.s_addr = htonl(INADDR_ANY);
//创建基于TCP的socket
if((nmsFd = socket(AF_INET,SOCK_DGRAM,0)) == ERROR)
{
printf("\n<<_TRAP>> Socket create error!");
return (ERROR);
}
//将socket绑定在本地地址上
if(bind(nmsFd,(struct sockaddr*)&serverSock, sockAddrSize) == ERROR)
{
printf("\n<<_TRAP>> Socket bind error!");
close(nmsFd);
return (ERROR);
}
//循环监听端口数据
while(1)
{
if(PrepareTrap(nmsFd) != ERROR)
{
printf("\n<<_TRAP>> Over %d turn",count++);
}
}
}
int PrepareTrap(int sFd)
{
int sockAddrSize; /*socket地址的数据结构大小*/
int buflen,snmplen,pdulen,asnlen;
char type;
char *buf,*backup;
char address[20];
TRAPMSG tx_msg;
SNMP_PDU *snmp;
sockAddrSize = sizeof(struct sockaddr_in);
snmp = snmpMalloc(sizeof(SNMP_PDU));
initSNMP(snmp);
memset(trapdata,0,4096);
if((buflen = recvfrom(sFd, trapdata, 4096, 0, (struct sockaddr *)&nmsAddr, &sockAddrSize)) == ERROR)
{
printf("\n<<_TRAP>> recvfrom UDP161 ERROR");
freesnmpPDU(snmp);
return ERROR;
}
inet_ntoa_b(nmsAddr.sin_addr,address);
printf("\n<<_TRAP>> NMS = %s",address);
//TAG:SEQUENCE--0x30 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(trapdata,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_SEQUENCE)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if(buflen != asnlen)
return ERROR;
snmplen = asnlen;
//VERSION TAG:INTEGER--0x2 | LENGTH -- 0x1 | VALUE -- (usually 0)
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_INTERGER)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR
|| asnlen != 1)
return ERROR;
if((buf = (char *)asnGetVersion(snmp,buf,(int *)&buflen)) == (char *)ERROR)
return ERROR;
if(snmp->version != SNMPV1)
return ERROR;
//CommunityTAG:OCTET STRING -- 0x4 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_OCTET)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetCommuName(snmp,buf,(int *)&buflen,&asnlen)) == (char *)ERROR)
return ERROR;
//PDU field TAG -- 0xa4(snmpv1) | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetPduCommand(snmp,buf,(int *)&buflen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if(buflen != asnlen)
return ERROR;
pdulen = asnlen;
//enterprise TAG:OBJECT ID -- 0x6 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_OBJIDT)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetEntID(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//agent address TAG: IPADDRESS -- 0x40 |LENGTH = 1| VALUE = 0
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_IP)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetAgentIP(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//generic trap TAG: INTERGER | LENGTH = 1 | VALUE = varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_INTERGER)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR
|| asnlen != 1)
return ERROR;
if((buf = (char *)asnGetTraptype(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//specific trap TAG: INTERGER | LENGTH = varies | VALUE = varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_INTERGER)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR
|| asnlen != 1)
return ERROR;
if((buf = (char *)asnGetSpecTrap(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//time stamp TAG: TIMETICK | LENGTH = varies | VALUE = varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_TIMETICK)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetTrapTime(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//VarBindList TAG 0x30 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_SEQUENCE)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if(buflen != asnlen)
return ERROR;
while(buflen > 0)
{
//Bind Variable TAG 0x30 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR)
return ERROR;
switch(type)
{
case TAG_SEQUENCE:
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
//Variable Value TAG 0x6 | LENGTH -- varies | VALUE -- varies
if((buf = (char *)asnGetType(buf,(int *)&buflen,&type)) == (char *)ERROR
||type != TAG_OBJIDT)
return ERROR;
if((buf = (char *)asnGetLen(buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
if((buf = (char *)asnGetOID(snmp,buf,(int *)&buflen,(int *)&asnlen)) == (char *)ERROR)
return ERROR;
default:
break;
}
}//循环,直到所有数据,所有OID处理完毕
tx_msg.msg = MSG_NMS_TRAP;
tx_msg.snmp = snmp;
msgQSend(trap_rx,(char *)&tx_msg,sizeof(TRAPMSG),WAIT_FOREVER,MSG_PRI_NORMAL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -