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