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

cld4siwp  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(138)

我尝试写一个非常小的SNMP陷阱接收器,监听UDP端口162。
陷阱很好,但我不能解码它们。
我已经找到了libber,但由于某种原因,它无法解码陷阱。我可能用错了。我想解码SNMP陷阱应该相当简单,我错过了一些关键的东西。是否可以使用NET-SNMP作为一个库,并从中创建一个小的陷阱接收程序?我一点也不感到惊讶,但找不到任何有关它的信息。也许我的谷歌功夫太弱了。

lqfhib0f

lqfhib0f1#

好吧,使用net-snmp,你通常使用snmptrapd守护进程来调用你的外部命令/脚本。如果你不能使用这种方式,我建议你看看snmptrapd. c代码。而且,如果我没记错的话,他们构建了一个libsnmptrapd库。应该很容易找到正确的API调用…
如果我有时间,我会用一个片段来更新我的答案...
my2c

jk9hmnmh

jk9hmnmh2#

要制作一个简单的snmp陷阱应用程序,您应该解析并运行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,value,value type,sender ipnumber等。的陷阱。

相关问题