本人在redhat linux写了一个基于net-snmp的trap程序(嵌入代理程序snmpd中),代码如下所示,编译通过,执行snmpd程序后,每隔3秒发送一次,通过提示信息可以得知snmp_send()函数执行结果非0,可是我的trap监视器却无法获取到所发送的trap信息。而执行snmptrap -v2c -c publictrap 192.168.0.147:162 "" UCD-SNMP-MIB::ucdStart命令则接收正常,请各位朋友指点一下迷津,谢谢!
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "asTrap.h"void
send_myTrapp(unsigned int clientreg, void *clientarg)
{
  netsnmp_session session,*ss;
  netsnmp_pdu *pdu;
 long sysuptime;
 char csysuptime[20];
  int status = 0;
  oid oid_sysuptime[] = { 1,3,6,1,2,1,1,3,0 };
  char *cp1="192.168.0.147", *cp2="publictrap";   // init session
  snmp_sess_init(&session);
  session.version = SNMP_VERSION_2c;
  session.peername = cp1;
  session.remote_port = 162;
  session.community = cp2; 
  session.community_len = strlen(session.community);
  ss = snmp_open(&session);
  if(ss==NULL) 
  {
    snmp_sess_perror("snmptrap open session error!",&session);
    exit(1);
  }
 
  // create pdu
  pdu = snmp_pdu_create(SNMP_MSG_TRAP2);  
  sysuptime = get_uptime();
 sprintf(csysuptime, "%ld", sysuptime); 
 status = snmp_add_var(pdu, oid_sysuptime,OID_LENGTH(oid_sysuptime), 't', csysuptime); 
  if(status!=0)
 { 
  snmp_sess_perror("snmptrap add sysuptime error!",&session);
  return;
 }  status = snmp_send(ss, pdu);
 if (status==0)
 { 
    snmp_sess_perror("snmptrap send info error!",&session);
  snmp_free_pdu(pdu);
  return;
 } 
  snmp_close(ss);  fprintf(stderr,"send snmptrap over %d...\n",status);
}void
init_asTrap(void)
{
  snmp_alarm_register(3, SA_REPEAT, send_asTrap_trap, NULL);
}