我正在尝试编写一个非常小的SNMP陷阱接收器,监听UDP端口162。
陷阱很好,但我无法对其进行解码。
我已经找到libber,但是由于某种原因它无法解码陷阱。我可能用错了。我想象对SNMP陷阱的解码应该相当简单,并且我缺少一些关键的东西。是否可以将NET-SNMP用作库并从中创建一个小的陷阱接收程序?我一点都不惊讶,但是找不到任何信息。也许我的Google-fu很弱。
好,使用net-snmp,通常使用snmptrapd守护程序,该守护程序需要您使用外部命令/脚本。如果您不能使用这种方式,建议您看一下snmptrapd.c代码。此外,如果我没记错的话,他们会建立一个libsnmptrapd库。找到正确的API调用应该很容易...
如果有时间,我将用摘要更新我的答案...
my2c
要创建一个简单的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;
}