如何使用c在net snmp中发送v2陷阱

时间:2015-05-05 10:31:24

标签: c++ c linux snmp net-snmp

我有以下配置:

  1. Trap oid = .1.3.6.1.4.1.78945.1.1.1.1.1
  2. 陷阱变量oid = .1.3.6.1.4.1.78945.1.1.2.1.0,变量类型=字符串
  3. 另一个陷阱变量oid = .1.3.6.1.4.1.78945.1.1.2.4.0,变量类型=整数。
  4. 陷阱监听器ip和端口= 192.168.4.10:1234
  5. 如何在linux中使用C或C ++和net-snmp模块发送陷阱?我需要一个示例代码。 net-snmp网站上的所有示例代码对我都不起作用。

    我的示例代码:

    #include <net-snmp/net-snmp-config.h>
    #include <net-snmp/net-snmp-includes.h>
    
    oid             objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
    oid             objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
    oid           trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};
    
    
    int main()
    {
        netsnmp_session session, *ss;
        netsnmp_pdu    *pdu, *response;
    
        char comm[] = "public";
        snmp_sess_init( &session );
        session.version = SNMP_VERSION_2c;
        session.community = comm;
        session.community_len = strlen(session.community);
        session.peername = "192.168.4.10:1234";
        ss = snmp_open(&session);
        if (!ss) {
          snmp_sess_perror("ack", &session);
          exit(1);
        }
    
        pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
        pdu->community = comm;
        pdu->community_len = strlen(comm);
        pdu->enterprise = trap_oid;
        pdu->enterprise_length = sizeof(trap_oid) / sizeof(oid);
        pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
        snmp_add_var(pdu, objid_name, sizeof(objid_name) / sizeof(oid), 's', "Test Name");
        snmp_add_var(pdu, objid_id, sizeof(objid_id) / sizeof(oid), 'i', "5468");
    
        send_trap_to_sess (ss, pdu);
        snmp_close(ss);
        return (0);
    }
    

    来自net-snmp网站的心跳通知示例让我误以为在哪里给听众详细信息?

    提前谢谢。

2 个答案:

答案 0 :(得分:1)

看起来系统正常运行时间和陷阱oid将被添加为pdu中的第一个变量。

以下代码可以解决问题:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

oid             objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
oid             objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid             objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid              trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};


int main()
{
    netsnmp_session session, *ss;
    netsnmp_pdu    *pdu, *response;
    char *trap = NULL;

    char comm[] = "public";
    snmp_sess_init( &session );
    session.version = SNMP_VERSION_2c;
    session.community = comm;
    session.community_len = strlen(session.community);
    session.peername = "192.168.4.10:1234";
    ss = snmp_open(&session);
    if (!ss) {
      snmp_sess_perror("ack", &session);
      exit(1);
    }

    pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
    pdu->community = comm;
    pdu->community_len = strlen(comm);
    pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;

    long sysuptime;
    char csysuptime [20];
    sysuptime = get_uptime ();
    sprintf (csysuptime, "%ld", sysuptime);
    trap = csysuptime;
    snmp_add_var (pdu, objid_sysuptime, sizeof (objid_sysuptime)/sizeof(oid),'t', trap);
    snmp_add_var(pdu, trap_oid, OID_LENGTH(trap_oid), 'o', "1.3.6.1.4.1.78945.1.1.1.1.1");
    snmp_add_var(pdu, objid_name, OID_LENGTH(objid_name), 's', "Test Name");
    snmp_add_var(pdu, objid_id, OID_LENGTH(objid_id) , 'i', "5468");

    send_trap_to_sess (ss, pdu);
    snmp_close(ss);
    return (0);
}

答案 1 :(得分:1)

net-snmp中的示例陷阱代码(notification.c)不能作为独立应用程序(即从您自己的主程序调用)。您需要启动一个子代理(agentX)守护程序,如net-snmp中的example-demon.c示例所示。在examples-demon中调用init.cnotification()在notification.c示例代码中定义while循环之前的example-demon.c

init_notification();
/* your main loop here... */
while(keep_running) {
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/*     --- OR ---  */
agent_check_and_process(1); /* 0 == don't block */

}

每隔30秒调用'send_example_notification(unsigned int clientreg,void * clientarg)',使用send_v2trap()发送陷阱。

Compile and build notification.c and example-demon.c into an executable example-demon
gcc -I. `net-snmp-config --cflags`   -c -o notification.o notification.c
gcc -I. `net-snmp-config --cflags`   -c -o example-demon.o example-demon.c  
gcc -o example-demon notification.o example-demon.o `net-snmp-config --agent-libs`

启动example-demon,您应该看到v2陷阱每30秒发送一次并在snmp管理器中收到(假设您在snmpd.conf文件中为主机IP设置了snmpsink等)。

您拥有的内容也是有效的,另一种使用您自己的代码发送陷阱的方法。 “snmptrap”命令也可用于将陷阱作为独立应用程序或从shell等发送。