程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> windows下使用net-snmp實現agent擴展(四)

windows下使用net-snmp實現agent擴展(四)

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved