在前三篇的内容里,介绍了使用net-snmp实现agent的Get/Set命令,下面介绍一下发送trap消息。发送trap消息时,系统默认的端口是162。使用下面的代码,可以实现trap消息的发送。

//该函数发送实时报警信息。与发送一般信息端口不同
void init\_alarm\_info(void)
{
DEBUGMSGTL((“dcsserver”,
“initializing (setting callback alarm)\n”));
//CDcsRunConfigManager *serverInfo = CDcsRunConfigManager::GetInstance();
snmp\_alarm\_register(5,
SA\_REPEAT,
send\_trap,
NULL
);
}
void send\_trap2(unsigned int clientreg, void *clientarg)
{
//MIB Tree中需要trap的报警节点节点主动trap的用./././././././2./
static oid oid\_cpu\_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 1 };
static oid oid\_memory\_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 2 };
static oid oid\_disk\_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 3 };
netsnmp\_pdu *pdu;
int status = 0;
// create pdu
pdu = snmp\_pdu\_create(SNMP\_MSG\_TRAP2); //SNMP\_MSG\_TRAP
if ( !pdu )
{
CDcslog::GetInstance()->dlog\_error(“send\_trap Failed to create trap PDU”);
return;
}
if(status != 0)
{
CDcslog::GetInstance()->dlog\_error(“send\_trap snmp\_add\_var() error”);
snmp\_free\_pdu(pdu);
return;
}
//SNMPV2 版本2
// status = create\_trap\_session(“127.0.0.1″, SNMP\_TRAP\_PORT, “public”, SNMP\_VERSION\_2c, SNMP\_MSG\_TRAP2);
//SNMPV1 第二个参数为SNMP\_TRAP\_PORT时有警告,应该为0
status = create\_trap\_session(DEFAULT\_ADDR, 0, “public”, SNMP\_VERSION\_1, SNMP\_MSG\_TRAP);
//第二个参数为SNMP\_TRAP\_PORT时有警告,应该为0
if (status == 0)
{
CDcslog::GetInstance()->dlog\_error(“send\_trap create\_trap\_session() error”);
snmp\_free\_pdu(pdu);
return;
}
//在这里添加要发送的变量,可以添加发送的逻辑
bool flag =false;
//cpu利用率大于85%时,添加到trap列表中
if ( GetUsedCPU()>85)
{
flag = true;
status = snmp\_add\_var(pdu, oid\_cpu\_Alarm, OID\_LENGTH(oid\_cpu\_Alarm), ‘s’, “cpu Alarming”);
}
//memory
if ( GetUsedMemory()>85)
{
flag = true;
status = snmp\_add\_var(pdu, oid\_memory\_Alarm, OID\_LENGTH(oid\_memory\_Alarm), ‘s’, “memory Alarming”);
}
//disk:c:
if ( GetUsedDisk()>85)
{
flag = true;
status = snmp\_add\_var(pdu, oid\_disk\_Alarm, OID\_LENGTH(oid\_disk\_Alarm), ‘s’, “disk Alarming”);
}
//列表中有内容,则发送
if (flag)
{
send\_trap\_vars(1, 0, pdu->variables);
}
//释放资源
snmpd\_free\_trapsinks();
snmp\_free\_pdu(pdu);
}

这样发送的trap消息,是比较灵活的。http://vcsky.net havenzhao

在net-snmp的源码中,notification.c文件也是发送trap消息的,它使用的api是: send\_v2trap(),但是要开启snmp的trap服务,才能发送成功。


到目前为止,已经完整的介绍了windows下使用net-snmp实现agent扩展的相关技术。由于接触的时间并不长,难免有不正确或者疏忽的地方,请多见谅。

标签: none

相关文章推荐

添加新评论,含*的栏目为必填