如何在C(或C ++)应用程序中接收和解码SNMP陷阱?

时间:2010-06-24 12:06:16

标签: c++ c snmp

我正在尝试编写一个非常小的SNMP陷阱接收器,监听UDP端口162。

陷阱很好,但我无法解码它们。

我找到了libber,但由于某些原因它无法解码陷阱。我可能错了。我想解码一个SNMP陷阱应该相当简单,我错过了一些关键的东西。是否可以使用NET-SNMP作为库并从中创建一个小的陷阱接收程序?我不会感到惊讶,但找不到任何有关它的信息。也许我的google-fu很弱。

2 个答案:

答案 0 :(得分:4)

好吧,使用net-snmp,您通常使用snmptrapd守护程序来调用外部命令/脚本。如果你不能这样使用,我建议你看一下snmptrapd.c代码。而且,如果我没记错的话,他们会构建一个libsnmptrapd库。应该很容易找到合适的API调用...

如果我有时间,我会用一个片段更新我的答案......

MY2C

答案 1 :(得分:1)

要制作一个简单的snmp陷阱应用程序,您应该解析并运行snmptrapd.c来捕获来自您定义的端口地址的陷阱。

对于初学者来说,代码结构很繁琐,所以我将告诉您snmptrapd.c的要点,以使其成为一个简单的陷阱接收器。

transport = netsnmp_transport_open_server("snmptrap", cp);

此行打开一个服务器,供您侦听定义的端口号“ cp”。

警告:在linux os中,端口162只能以root用户身份进行监听。因此,如果您想监听端口162,则应使用sudo运行代码。

ss = snmptrapd_add_session(transport);

您应该创建一个netsnmp_session。

while (netsnmp_running) {
        ...
        numfds = 0;
        FD_ZERO(&readfds);
        FD_ZERO(&writefds);
        FD_ZERO(&exceptfds);
        block = 0;
        tvp = &timeout;
        timerclear(tvp);
        tvp->tv_sec = 5;
        snmp_select_info(&numfds, &readfds, tvp, &block);
        if (block == 1)
            tvp = NULL;         /* block without timeout */
        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
        if (count > 0) {
            if (count > 0) {
                snmp_read(&readfds);
            }
        } else {
            switch (count) {
            case 0:
                snmp_timeout();
                break;
            case -1:
                if (errno == EINTR)
                    continue;
                netsnmp_running = 0;
                break;
            default:
                netsnmp_running = 0;
            }   
       }
 }

在定义的端口捕获snmp陷阱的主循环。

static netsnmp_session *
snmptrapd_add_session(netsnmp_transport *t)
{
    ...
    session->callback = snmp_input;
    ...
}

毕竟,陷阱的数据将位于

snmp_input

功能。您可以使用oid,value,value类型,sender ipnumber等。 陷阱。