为了制作一个简单的 SNMP Trap 应用程序,您应该解析并运行 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;
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、值、值类型、发送者ip地址等信息。