欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > windows >内容正文

windows

windows下使用net-snmp实现agent扩展(四)

发布时间:2025/3/15 windows 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 windows下使用net-snmp实现agent扩展(四) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

[cpp] view plaincopy print?
  • //该函数发送实时报警信息。与发送一般信息端口不同  
  • void init_alarm_info(void)  
  • {  
  • DEBUGMSGTL((“dcsserver”,  
  • “initializing (setting callback alarm)\n”));  
  • //CDcsRunConfigManager *serverInfo = CDcsRunConfigManager::GetInstance();  
  • snmp_alarm_register(5,/*serverInfo->GetTrapTimeSpan();*/ /* seconds, 秒 */  
  • SA_REPEAT, /* repeat (every 30 seconds). 每隔30秒发送一个trap */  
  • send_trap, /* our callback 我们的回调函数 */  
  • NULL /* no callback data needed */  
  • );  
  • }  
  • 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);  
  • }  
  • //该函数发送实时报警信息。与发送一般信息端口不同 void init_alarm_info(void) { DEBUGMSGTL((“dcsserver”, “initializing (setting callback alarm)\n”)); //CDcsRunConfigManager *serverInfo = CDcsRunConfigManager::GetInstance(); snmp_alarm_register(5,/*serverInfo->GetTrapTimeSpan();*/ /* seconds, 秒 */ SA_REPEAT, /* repeat (every 30 seconds). 每隔30秒发送一个trap */ send_trap, /* our callback 我们的回调函数 */ NULL /* no callback data needed */ ); } 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扩展的相关技术。由于接触的时间并不长,难免有不正确或者疏忽的地方,请多见谅。

    总结

    以上是生活随笔为你收集整理的windows下使用net-snmp实现agent扩展(四)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。