Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C(或C+;+;)应用程序中接收和解码SNMP陷阱?_C++_C_Snmp - Fatal编程技术网

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

C++ 如何在C(或C+;+;)应用程序中接收和解码SNMP陷阱?,c++,c,snmp,C++,C,Snmp,我正在尝试编写一个非常小的SNMP陷阱接收器,监听UDP端口162 陷阱很好,但我无法破解 我找到了libber,但由于某种原因它无法破解陷阱。我可能用错了。我认为解码SNMP陷阱应该相当简单,而且我遗漏了一些关键的东西。是否可以将NET-SNMP用作库并从中创建一个小型陷阱接收程序?我一点也不感到惊讶,但找不到任何关于它的信息。也许我的google fu很弱。好吧,使用net snmp,您通常使用snmptrapd守护进程来调用外部命令/脚本。如果不能使用这种方法,我建议您查看snmptrap

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

陷阱很好,但我无法破解


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

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

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


my2c

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

对于初学者来说,代码结构很难捕获,因此我将告诉您snmptrapd.c的要点,以制作一个简单的陷阱接收器

transport=netsnmp\u transport\u open\u服务器(“snmptrap”,cp)

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

警告:在linux操作系统中,端口162只能使用root用户进行侦听。因此,如果您想监听端口162,应该使用sudo运行代码

ss=snmptrapd\u添加\u会话(传输)

您应该创建一个netsnmp_会话

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

毕竟,你的陷阱的数据将在

snmp\u输入

功能。您可以获取oid、值、值类型、发送方ipnumber等。 陷阱

来检查我的代码:
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;
            }   
       }
 }
static netsnmp_session *
snmptrapd_add_session(netsnmp_transport *t)
{
    ...
    session->callback = snmp_input;
    ...
}