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

4
我正在尝试编写一个非常小的SNMP陷阱接收器,监听UDP端口162。
陷阱已经成功送达,但我无法解码它们。
我已经找到了libber,但由于某些原因它无法解码陷阱。我可能在使用它时出了问题。我想解码SNMP陷阱应该非常简单,并且我肯定漏掉了一些关键的东西。是否可以使用NET-SNMP作为库并从中创建一个小型陷阱接收程序? 我不会感到惊讶,但找不到任何相关信息。也许我的搜索能力不够强。

来看看我的代码:http://stackoverflow.com/questions/38484287/how-to-decode-the-result-of-listenning-to-port-162-snmp-trap/38495948#38495948 - Tarik
2个回答

4

使用net-snmp,通常使用snmptrapd守护程序调用外部命令/脚本。如果您无法使用这种方式,建议查看snmptrapd.c代码。此外,如果我记得正确,他们构建了一个libsnmptrapd库。应该很容易找到正确的API调用...

如果我有时间,我会更新我的答案并提供代码片段...

以上仅供参考。


3
为了制作一个简单的 SNMP Trap 应用程序,您应该解析并运行 snmptrapd.c 来捕获来自您定义的端口地址的陷阱。
代码结构对于初学者来说比较复杂,因此我将告诉您 snmptrapd.c 的重要点,以便创建一个简单的陷阱接收器。 transport = netsnmp_transport_open_server("snmptrap", cp); 这一行为您打开了一个服务器,以便您监听已定义的端口号 "cp"。
警告:在 Linux 操作系统中,端口 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、值、值类型、发送者ip地址等信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接