阅读完本文你可以学到:
(1)在 Windows 平台下如何搭建与 SNMP 代理进行通信的开发环境(支持 SNMP V3),并给出测试程序。
一、搭建与 SNMP 代理进行通信的开发环境(支持 SNMP V3)(在 VS2013 下演示)
1. 下载 SNMP++ 和 LIBDES
SNMP++官方下载地址:http://www.agentpp.com/download.html#AGENTPP,如图1-1:
图1-1
请注意:
我一开始使用的是 SNMP++3.3.7,但编译后出现有些文件打不开,其中路径不对的问题可以 easy 解决,但有些文件根本就不存在。后来改用 snmp++v3.2.25,最后测试成功。下面详细记录从无到测试成功的每一个过程。
重申一遍,以下所有内容使用的是 snmp++v3.2.25.tar.gz 及 libdes-l-4.01a.tar.gz,以下内容一定不适用于 SNMP++3.3.7.tar.gz,至于 libdes的的其他版本是否适用尚未验证。也就是说,如果你使用的不是 snmp++v3.2.25.tar.gz 及 libdes-l-4.01a.tar.gz,我并不能保证阅读完本文可使你获得正确的测试结果。
2. 生成 snmp++lib 静态 lib 文件(注:snmp++lib 为你要生成的 lib 的文件名,可自拟)
(1)新建一个“Win32”项目,如图2-1:
图2-1
(2)只选择“静态库”,其余的都不选,如图2-2:(虽然看到有些博客说加上“预编译头”最后也可以成功,但是本人强烈建议“尽最大可能降低你所生成库的依赖项”)
图2-2
(3)解压先前下载好的压缩包 并分别解压 libdes-l-4.01a.tar.gz 和 snmp++v3.2.25.tar.gz。如图2-3:
图2-3
(4)将文件夹 libdes-l-4.01 和 snmp++v3.2.25 拷贝到你刚刚建立的 snmp++lib 工程中,如图2-4:
图2-4
(5)添加源文件。将 snmp++lib\snmp++v3.2.25\snmp++\src 下的所有源文件添加到工程中,并将 snmp++lib\libdes-l-4.01a\libdes 下的所有源文件添加到工程中,如图2-5:
图2-5
(6)添加头文件。将 snmp++lib\snmp++v3.2.25\snmp++\include\snmp_pp 下的所有头文件添加到工程中,并将 snmp++lib\libdes-l-4.01a\libdes 下的所有头文件添加到工程中。添加方法为:项目->snmp++lib属性页->C/C++->常规->附加包含目录,如图2-6:
图2-6
(7)生成解决方案,如图2-7:
图2-7
(8)生成解决方案成功后在该工程中的Debug下找到生成的 snmp++lib.lib 文件,如图2-8:
图2-8
3. 生成 libdeslib 静态 lib 文件(和生成 snmp++lib.lib 的方法一样)。
4. 在 windows 平台下编写第一个与SNMP代理进行通信的控制台程序(使用前面生成的 snmp++lib.lib 和 libdeslib.lib)。
(1)新建一个控制台程序,项目名称为 snmptest
(2)在该工程下新建文件夹 snmp++,用于存放相关头文件及库文件,如图2-9:
图2-9
在建好 snmp++ 文件夹后,在 snmp++文件夹 下建立 include文件夹,用于存放相关头文件,并建立 lib 文件夹,用于存放 snmp++lib.lib 和 libdeslib.lib。如图2-10:
2-10
include 文件夹中存放 snmp++v3.2.25\snmp++\include\snmp_pp (这是前面解压的 snmp++v3.2.25.tar.gz)中所有的头文件及 libdes-l-4.01a\libdes(这是前面解压的 libdes-l-4.01a.tar.gz)中的所有头文件。
lib 文件夹中存放 snmp++lib.lib 和 libdeslib.lib。
(3)配置该工程的属性:项目->snmptest属性->链接器->输入。在附加依赖项中添加 ws2_32.lib;snmp++\lib\libdeslib;snmp++\lib\snmp++lib.lib; 。如图2-11:
图2-11
(4)测试程序为:
// snmptest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "snmp++\include\snmp_pp.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Snmp::socket_startup();
CTarget target(IpAddress("10.116.2.18"), "private-xxq", "private-xxq");
target.set_version(version1);
Vb vb("1.3.6.1.2.1.1.1.0");
Pdu pdu;
pdu += vb;
int status;
Snmp snmp(status);
if (SNMP_CLASS_SUCCESS != status)
{
cout << snmp.error_msg(status) << endl;
return -1;
}
cout << "目的IP:" << target.get_address().get_printable() << " 版本号:" << target.get_version() << endl;
cout << "read共同体:" << target.get_readcommunity() << " write共同体:" << target.get_writecommunity() << endl;
if ( (status = snmp.get(pdu, target)) == SNMP_CLASS_SUCCESS )
{
pdu.get_vb(vb, 0);
cout << "System Descriptor =" << vb.get_printable_value() << endl;
}
else
{
cout << snmp.error_msg(status) << endl;
return -1;
}
Snmp::socket_cleanup();
return 0;
}
(5)启动并配置 SNMP代理。
(注意 SNMP代理中共同体的名称必须与测试程序的共同体名称保持一致)
(6)在 SNMP代理启动并配置好后,运行测试程序。结果如下:
要成功地与本地SNMP代理进行通信,除了该工程外,你还需要对本地 SNMP代理进行配置(可参考本文相关部分)。