这次的任务是基于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)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
__stdcall TrapSendTest()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
netsnmp_session session,*ss;
netsnmp_pdu *pdu;
long sysuptime;
char csysuptime[20];
int status = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SOCK_STARTUP;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
ss = snmp_add(&session,
netsnmp_transport_open_client("snmptrap",
session.peername),
NULL,
NULL);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if (ss == NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
snmp_sess_perror("snmptable", &session);
SOCK_CLEANUP;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
snmp_sess_perror("snmptrap add sysuptime error!", &session);
return -1;
}
status = snmp_send(ss, pdu);
if (status == 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
工作中遇到的困难:
1、
开始的时候整个工程编译不过去:
这八成就是环境配置有问题,如MD/MT问题、静态库引用问题等,因为我要写dll接口,还碰到了 __cdecl,__stdcall调用问题(一般为LNK2001和LNK2009,无法解析符号___argc,___argv,__mbctype,如: error LNK2001: 无法解析的外部符号 ___argc),解决方案是配置属性>>常规>>MFC的使用选择“在共享的DLL中使用MFC”。
这八成就是环境配置有问题,如MD/MT问题、静态库引用问题等,因为我要写dll接口,还碰到了 __cdecl,__stdcall调用问题(一般为LNK2001和LNK2009,无法解析符号___argc,___argv,__mbctype,如: error LNK2001: 无法解析的外部符号 ___argc),解决方案是配置属性>>常规>>MFC的使用选择“在共享的DLL中使用MFC”。
2、开始的时候不知道该使用什么api,帮助文档又不多,在网上看了些例子代码,使用了
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
以为函数snmp_synch_response自动根据ss及pdu的类型自动选择目标主机端口,原来不是如此。snmp_synch_response发送snmp数据包到目标主机161端口,而接受trap包的端口应该为162端口,后来参考snmptrap项目发现是我的判读失误了,应该使用
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
发送trap包。
3、 为防止内存泄漏发包完毕后需要调用
snmp_close(ss);
snmp_shutdown("snmptrap");
SOCK_CLEANUP;
这三个函数释放资源。