资源简介

用net-snmp的c apis实现trap的接收,类似于snmptrapd工具的实现,但是更为简单。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 




int      netsnmp_running = 1;

/************************************************************************
** 
** 
************************************************************************/

int snmp_input(int op netsnmp_session *session int reqid netsnmp_pdu *pdu void *magic)
{
    printf(“We got a trap:\n“);
    struct variable_list *vars;
    for(vars = pdu->variables; vars; vars = vars->next_variable)
    {
        print_variable(vars->name vars->name_length vars);
    }
    return 1;
}

static int pre_parse(netsnmp_session * session netsnmp_transport *transport
          void *transport_data int transport_data_length)
{
return 1;
}

static netsnmp_session *snmptrapd_add_session(netsnmp_transport *t)
{
    netsnmp_session sess *session = &sess *rc = NULL;

    snmp_sess_init(session);
    session->peername = SNMP_DEFAULT_PEERNAME;  /* Original code had NULL here */
    session->version = SNMP_DEFAULT_VERSION;
    session->community_len = SNMP_DEFAULT_COMMUNITY_LEN;
    session->retries = SNMP_DEFAULT_RETRIES;
    session->timeout = SNMP_DEFAULT_TIMEOUT;
    session->callback = snmp_input;
    session->callback_magic = (void *) t;
    session->authenticator = NULL;
    sess.isAuthoritative = SNMP_SESS_UNKNOWNAUTH;

    rc = snmp_add(session t pre_parse NULL);
    if (rc == NULL)
{
        snmp_sess_perror(“snmptrapd“ session);
    }
    return rc;
}

static void snmptrapd_close_sessions(netsnmp_session * sess_list)
{
    netsnmp_session *s = NULL *next = NULL;

    for (s = sess_list; s != NULL; s = next)
{
        next = s->next;
        snmp_close(s);
    }
}

static void snmptrapd_main_loop(void)
{
int count numfds block;
fd_set readfdswritefdsexceptfds;
struct timeval  timeout *tvp;

printf(“snmptrapd_main_loop\n“);

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 */
}

#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
netsnmp_external_event_info(&numfds &readfds &writefds &exceptfds);
#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */

count = select(numfds &readfds &writefds &exceptfds tvp);
printf(“count = %d\n“ count);
if (count > 0)
{
#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
netsnmp_dispatch_external_events(&count &readfds &writefds &exceptfds);
#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */

/* If there are any more events after external events then try SNMP events. */
if (count > 0)
{
snmp_read(&readfds);
}
}
else 
{
switch (count)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6725  2013-06-06 10:57  snmptrapd\snmptrapd-linux.c

     文件       7178  2013-06-06 10:49  snmptrapd\snmptrapd-windows.cpp

     目录          0  2013-06-09 10:44  snmptrapd

----------- ---------  ---------- -----  ----

                13903                    3


评论

共有 条评论