基于net-snmp发送trap包到目的主机

  
这次的任务是基于net-snmp发送trap包到指定IP。
Net-snmp是一个开源代码,在 http://net-snmp.sourceforge.net/download.html可以下载,我所使用的版本为5.4.1,但是帮助文档不够详尽,相关资料甚少,希望这篇文章对刚接触这方面的人有所帮助,我也是刚接触net-snmp,有很多不懂的地方,希望有达人指点。
首先要编译整个工程,生成静态库文件,否则后面的工作不能进行。
打开net-snmp-5.4.1/win32/win32.dsw,我使用的环境为VS2003,需要对所有的项目进行转换。
打开snmptrap项目,观察其静态库引用路径可以发现它的路径配置为../lib/debug,这也正是生成项目后产生的lib文件的路径。自己项目的库文件引用配置路径可以参考snmptrap项目。
刚下载的程序包是不包含库文件的,需要自己生成。先后生成libagent、libhelpers、libnetsnmptrapd、libsnmp、netsnmpmibs五个项目,相应会生成五个静态库文件,包括:netsnmp.lib、netsnmpagent.lib、netsnmphelpers.lib、netsnmpmibs.lib和netsnmptrapd.lib。没有这些静态库文件就不能生成整个解决方案,这也正是直接生成解决方案不能成功的原因。好了,现在可以重新生成整个解决方案了。如果这步成功了那么就可以开始自己的工作了。
自己的项目的配置属性可以参考项目snmptrap或者项目snmptest来配置。下面这段代码是一段简单的测试程序,可以正常发送trap包到目标主机162端口,可以在此基础上根据自己的实际需要修改。
 
#include  < net - snmp / net - snmp - config.h >
#include 
< net - snmp / net - snmp - includes.h >
config_require(util_funcs)

int  __stdcall TrapSendTest()
{
    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.1.20"*cp2 = "public"
    
    snmp_sess_init(
&session);
    session.version 
= SNMP_VERSION_2c;
    session.peername 
= cp1;
    session.remote_port 
= 162;
    session.community 
= (unsigned char*)cp2;
    session.community_len 
= strlen((char *)session.community);
    session.retries 
= 3;
    session.timeout 
= 2000;
    session.sessid 
= 0;

    SOCK_STARTUP;

    ss 
= snmp_add(&session,
        netsnmp_transport_open_client(
"snmptrap"
        session.peername),
        NULL, 
        NULL);

    
if (ss == NULL) 
    
{
        snmp_sess_perror(
"snmptable"&session);
        SOCK_CLEANUP;
    }


    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 -1;
    }

    status 
= snmp_send(ss, pdu);
    
if (status == 0)
    

        snmp_sess_perror(
"snmptrap send info error!"&session);
        snmp_free_pdu(pdu);
        
return -2;
    }
 
    snmp_close(ss);
    snmp_shutdown(
"snmptrap");
    SOCK_CLEANUP;
    fprintf(stderr,
"send snmptrap over %d... ", status);
    
return 0;
}

 
 

工作中遇到的困难: 

1、 开始的时候整个工程编译不过去:
    这八成就是环境配置有问题,如MD/MT问题、静态库引用问题等,因为我要写dll接口,还碰到了
__cdecl,__stdcall调用问题(一般为LNK2001LNK2009,无法解析符号___argc___argv__mbctype,如: error LNK2001: 无法解析的外部符号 ___argc),解决方案是配置属性>>常规>>MFC的使用选择“在共享的DLL中使用MFC”。

2、开始的时候不知道该使用什么api,帮助文档又不多,在网上看了些例子代码,使用了

ss  =  snmp_open( & session);
snmp_synch_response(ss, pdu, 
& response);

以为函数snmp_synch_response自动根据sspdu的类型自动选择目标主机端口,原来不是如此。snmp_synch_response发送snmp数据包到目标主机161端口,而接受trap包的端口应该为162端口,后来参考snmptrap项目发现是我的判读失误了,应该使用

 

ss  =  snmp_add( & session, netsnmp_transport_open_client( " snmptrap " , session.peername), NULL, NULL);
snmp_send(ss, pdu);

 

发送trap包。

3、         为防止内存泄漏发包完毕后需要调用

snmp_close(ss);

snmp_shutdown("snmptrap");

SOCK_CLEANUP;

这三个函数释放资源。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值