如何使用 c 在 net snmp 中发送 v2 陷阱
How to send v2 traps in net snmp using c
我有以下配置:
- 陷阱 oid = .1.3.6.1.4.1.78945.1.1.1.1.1
- 陷阱变量oid=.1.3.6.1.4.1.78945.1.1.2.1.0,变量类型=string
- 另一个Trap变量oid=.1.3.6.1.4.1.78945.1.1.2.4.0,变量类型=整数.
- 陷阱监听ip和端口=192.168.4.10:1234
如何在 linux 中使用 C 或 C++ 和 net-snmp 模块发送陷阱?我需要一个示例代码。 net-snmp 站点上的所有示例代码都不适合我。
我的示例代码:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
oid objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};
int main()
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}
pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->enterprise = trap_oid;
pdu->enterprise_length = sizeof(trap_oid) / sizeof(oid);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
snmp_add_var(pdu, objid_name, sizeof(objid_name) / sizeof(oid), 's', "Test Name");
snmp_add_var(pdu, objid_id, sizeof(objid_id) / sizeof(oid), 'i', "5468");
send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}
来自 net-snmp 站点的心跳通知示例让我感到困惑,不知道在哪里提供侦听器详细信息?
提前致谢。
看起来系统正常运行时间和陷阱 oid 将作为第一个变量添加到 pdu 中。
下面的代码起到了作用:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
oid objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
oid objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};
int main()
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
char *trap = NULL;
char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}
pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
long sysuptime;
char csysuptime [20];
sysuptime = get_uptime ();
sprintf (csysuptime, "%ld", sysuptime);
trap = csysuptime;
snmp_add_var (pdu, objid_sysuptime, sizeof (objid_sysuptime)/sizeof(oid),'t', trap);
snmp_add_var(pdu, trap_oid, OID_LENGTH(trap_oid), 'o', "1.3.6.1.4.1.78945.1.1.1.1.1");
snmp_add_var(pdu, objid_name, OID_LENGTH(objid_name), 's', "Test Name");
snmp_add_var(pdu, objid_id, OID_LENGTH(objid_id) , 'i', "5468");
send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}
net-snmp 中的示例陷阱代码 (notification.c) 无法作为独立应用程序运行(即从您自己的主应用程序调用)。您需要启动一个子代理(agentX)守护进程,如 net-snmp 中的 example-demon.c 示例所示。在 example-demon 中,在 example-demon.c
的 while 循环之前调用 notification.c 示例代码中定义的 init_notification()
init_notification();
/* your main loop here... */
while(keep_running) {
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/* --- OR --- */
agent_check_and_process(1); /* 0 == don't block */
}
每 30 秒调用一次 'send_example_notification(unsigned int clientreg, void *clientarg)',使用 send_v2trap() 发送陷阱。
Compile and build notification.c and example-demon.c into an executable example-demon
gcc -I. `net-snmp-config --cflags` -c -o notification.o notification.c
gcc -I. `net-snmp-config --cflags` -c -o example-demon.o example-demon.c
gcc -o example-demon notification.o example-demon.o `net-snmp-config --agent-libs`
启动 example-demon,您应该会看到 v2 陷阱每 30 秒发送一次并在您的 snmp 管理器中接收(假设您在 snmpd.conf 文件中为您的主机 IP 设置了 snmpsink 等)。
您所拥有的也是有效的,并且是使用您自己的代码发送陷阱的另一种方式。 "snmptrap" 命令也可用于作为独立应用程序或从 shell 等发送陷阱。
我有以下配置:
- 陷阱 oid = .1.3.6.1.4.1.78945.1.1.1.1.1
- 陷阱变量oid=.1.3.6.1.4.1.78945.1.1.2.1.0,变量类型=string
- 另一个Trap变量oid=.1.3.6.1.4.1.78945.1.1.2.4.0,变量类型=整数.
- 陷阱监听ip和端口=192.168.4.10:1234
如何在 linux 中使用 C 或 C++ 和 net-snmp 模块发送陷阱?我需要一个示例代码。 net-snmp 站点上的所有示例代码都不适合我。
我的示例代码:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
oid objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};
int main()
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}
pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->enterprise = trap_oid;
pdu->enterprise_length = sizeof(trap_oid) / sizeof(oid);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
snmp_add_var(pdu, objid_name, sizeof(objid_name) / sizeof(oid), 's', "Test Name");
snmp_add_var(pdu, objid_id, sizeof(objid_id) / sizeof(oid), 'i', "5468");
send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}
来自 net-snmp 站点的心跳通知示例让我感到困惑,不知道在哪里提供侦听器详细信息?
提前致谢。
看起来系统正常运行时间和陷阱 oid 将作为第一个变量添加到 pdu 中。
下面的代码起到了作用:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
oid objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
oid objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};
int main()
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
char *trap = NULL;
char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}
pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
long sysuptime;
char csysuptime [20];
sysuptime = get_uptime ();
sprintf (csysuptime, "%ld", sysuptime);
trap = csysuptime;
snmp_add_var (pdu, objid_sysuptime, sizeof (objid_sysuptime)/sizeof(oid),'t', trap);
snmp_add_var(pdu, trap_oid, OID_LENGTH(trap_oid), 'o', "1.3.6.1.4.1.78945.1.1.1.1.1");
snmp_add_var(pdu, objid_name, OID_LENGTH(objid_name), 's', "Test Name");
snmp_add_var(pdu, objid_id, OID_LENGTH(objid_id) , 'i', "5468");
send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}
net-snmp 中的示例陷阱代码 (notification.c) 无法作为独立应用程序运行(即从您自己的主应用程序调用)。您需要启动一个子代理(agentX)守护进程,如 net-snmp 中的 example-demon.c 示例所示。在 example-demon 中,在 example-demon.c
的 while 循环之前调用 notification.c 示例代码中定义的 init_notification()init_notification();
/* your main loop here... */
while(keep_running) {
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/* --- OR --- */
agent_check_and_process(1); /* 0 == don't block */
}
每 30 秒调用一次 'send_example_notification(unsigned int clientreg, void *clientarg)',使用 send_v2trap() 发送陷阱。
Compile and build notification.c and example-demon.c into an executable example-demon
gcc -I. `net-snmp-config --cflags` -c -o notification.o notification.c
gcc -I. `net-snmp-config --cflags` -c -o example-demon.o example-demon.c
gcc -o example-demon notification.o example-demon.o `net-snmp-config --agent-libs`
启动 example-demon,您应该会看到 v2 陷阱每 30 秒发送一次并在您的 snmp 管理器中接收(假设您在 snmpd.conf 文件中为您的主机 IP 设置了 snmpsink 等)。
您所拥有的也是有效的,并且是使用您自己的代码发送陷阱的另一种方式。 "snmptrap" 命令也可用于作为独立应用程序或从 shell 等发送陷阱。