1. 程式人生 > >windows下使用net-snmp實現agent擴充套件(四)

windows下使用net-snmp實現agent擴充套件(四)

在前三篇的內容裡,介紹了使用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,/*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擴充套件的相關技術。由於接觸的時間並不長,難免有不正確或者疏忽的地方,請多見諒。