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

来源:互联网 发布:淘宝耐克正品店铺 贴吧 编辑:程序博客网 时间:2024/06/05 09:07

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

[cpp] view plain copy
print?
  1. //该函数发送实时报警信息。与发送一般信息端口不同  
  2. void init_alarm_info(void)  
  3. {  
  4. DEBUGMSGTL((“dcsserver”,  
  5. “initializing (setting callback alarm)\n”));  
  6. //CDcsRunConfigManager *serverInfo = CDcsRunConfigManager::GetInstance();  
  7. snmp_alarm_register(5,/*serverInfo->GetTrapTimeSpan();*/ /* seconds, 秒 */  
  8. SA_REPEAT, /* repeat (every 30 seconds). 每隔30秒发送一个trap */  
  9. send_trap, /* our callback 我们的回调函数 */  
  10. NULL /* no callback data needed */  
  11. );  
  12. }  
  13. void send_trap2(unsigned int clientreg, void *clientarg)  
  14. {  
  15. //MIB Tree中需要trap的报警节点节点主动trap的用./././././././2./  
  16. static oid oid_cpu_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 1 };  
  17. static oid oid_memory_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 2 };  
  18. static oid oid_disk_Alarm[] = {1, 3, 6, 1, 4, 1, 9000, 2, 3 };  
  19. netsnmp_pdu *pdu;  
  20. int status = 0;  
  21. // create pdu  
  22. pdu = snmp_pdu_create(SNMP_MSG_TRAP2); //SNMP_MSG_TRAP  
  23. if ( !pdu )  
  24. {  
  25. CDcslog::GetInstance()->dlog_error(“send_trap Failed to create trap PDU”);  
  26. return;  
  27. }  
  28. if(status != 0)  
  29. {  
  30. CDcslog::GetInstance()->dlog_error(“send_trap snmp_add_var() error”);  
  31. snmp_free_pdu(pdu);  
  32. return;  
  33. }  
  34. //SNMPV2 版本2  
  35. // status = create_trap_session(“127.0.0.1″, SNMP_TRAP_PORT, “public”, SNMP_VERSION_2c, SNMP_MSG_TRAP2);  
  36. //SNMPV1 第二个参数为SNMP_TRAP_PORT时有警告,应该为0  
  37. status = create_trap_session(DEFAULT_ADDR, 0, “public”, SNMP_VERSION_1, SNMP_MSG_TRAP);  
  38. //第二个参数为SNMP_TRAP_PORT时有警告,应该为0  
  39. if (status == 0)  
  40. {  
  41. CDcslog::GetInstance()->dlog_error(“send_trap create_trap_session() error”);  
  42. snmp_free_pdu(pdu);  
  43. return;  
  44. }  
  45. //在这里添加要发送的变量,可以添加发送的逻辑  
  46. bool flag =false;  
  47. //cpu利用率大于85%时,添加到trap列表中  
  48. if ( GetUsedCPU()>85)  
  49. {  
  50. flag = true;  
  51. status = snmp_add_var(pdu, oid_cpu_Alarm, OID_LENGTH(oid_cpu_Alarm), ‘s’, “cpu Alarming”);  
  52. }  
  53. //memory  
  54. if ( GetUsedMemory()>85)  
  55. {  
  56. flag = true;  
  57. status = snmp_add_var(pdu, oid_memory_Alarm, OID_LENGTH(oid_memory_Alarm), ‘s’, “memory Alarming”);  
  58. }  
  59. //disk:c:  
  60. if ( GetUsedDisk()>85)  
  61. {  
  62. flag = true;  
  63. status = snmp_add_var(pdu, oid_disk_Alarm, OID_LENGTH(oid_disk_Alarm), ‘s’, “disk Alarming”);  
  64. }  
  65. //列表中有内容,则发送  
  66. if (flag)  
  67. {  
  68. send_trap_vars(1, 0, pdu->variables);  
  69. }  
  70. //释放资源  
  71. snmpd_free_trapsinks();  
  72. snmp_free_pdu(pdu);  
  73. }  

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

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

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

原创粉丝点击