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

问题描述 投票:4回答:2

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

陷阱很好,但我无法对其进行解码。

我已经找到libber,但是由于某种原因它无法解码陷阱。我可能用错了。我想象对SNMP陷阱的解码应该相当简单,并且我缺少一些关键的东西。是否可以将NET-SNMP用作库并从中创建一个小的陷阱接收程序?我一点都不惊讶,但是找不到任何信息。也许我的Google-fu很弱。

c++ c snmp
2个回答
4
投票

好,使用net-snmp,通常使用snmptrapd守护程序,该守护程序需要您使用外部命令/脚本。如果您不能使用这种方式,建议您看一下snmptrapd.c代码。此外,如果我没记错的话,他们会建立一个libsnmptrapd库。找到正确的API调用应该很容易...

如果有时间,我将用摘要更新我的答案...

my2c


0
投票

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

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

transport = netsnmp_transport_open_server("snmptrap", cp);

此行打开一个服务器供您监听。“ cp”是您要监听的端口号。

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

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;
            }   
© www.soinside.com 2019 - 2024. All rights reserved.