阅读完本文你可以学到:

(1)在 Windows 平台下如何搭建与 SNMP 代理进行通信的开发环境(支持 SNMP V3),并给出测试程序。


一、搭建与 SNMP 代理进行通信的开发环境(支持 SNMP V3)(在 VS2013 下演示)

1. 下载 SNMP++ 和 LIBDES

SNMP++官方下载地址:​​http://www.agentpp.com/download.html#AGENTPP​​,如图1-1:

SNMP++ 00-开发准备篇_windows

图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:

SNMP++ 00-开发准备篇_snmp++_02

图2-1

(2)只选择“静态库”,其余的都不选,如图2-2:(虽然看到有些博客说加上“预编译头”最后也可以成功,但是本人强烈建议“尽最大可能降低你所生成库的依赖项”)

SNMP++ 00-开发准备篇_头文件_03

图2-2


(3)解压先前下载好的压缩包  并分别解压 libdes-l-4.01a.tar.gz 和 snmp++v3.2.25.tar.gz。如图2-3:

SNMP++ 00-开发准备篇_snmp++_04

图2-3

(4)将文件夹 libdes-l-4.01 和 snmp++v3.2.25 拷贝到你刚刚建立的 snmp++lib 工程中,如图2-4:

SNMP++ 00-开发准备篇_SNMP_05

图2-4

(5)添加源文件。将 snmp++lib\snmp++v3.2.25\snmp++\src 下的所有源文件添加到工程中,并将 snmp++lib\libdes-l-4.01a\libdes 下的所有源文件添加到工程中,如图2-5:

SNMP++ 00-开发准备篇_头文件_06

图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:

SNMP++ 00-开发准备篇_头文件_07

图2-6

(7)生成解决方案,如图2-7:

SNMP++ 00-开发准备篇_windows_08

图2-7

(8)生成解决方案成功后在该工程中的Debug下找到生成的 snmp++lib.lib 文件,如图2-8:

SNMP++ 00-开发准备篇_snmp++_09

图2-8

3. 生成 libdeslib 静态 lib 文件(和生成 snmp++lib.lib 的方法一样)。

4. 在 windows 平台下编写第一个与SNMP代理进行通信的控制台程序(使用前面生成的 snmp++lib.lib 和 libdeslib.lib)。

(1)新建一个控制台程序,项目名称为 snmptest

(2)在该工程下新建文件夹 snmp++,用于存放相关头文件及库文件,如图2-9:

SNMP++ 00-开发准备篇_SNMP_10

图2-9

在建好 snmp++ 文件夹后,在 snmp++文件夹 下建立 include文件夹,用于存放相关头文件,并建立 lib 文件夹,用于存放 snmp++lib.lib 和 libdeslib.lib。如图2-10:

SNMP++ 00-开发准备篇_snmp++_11

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:

SNMP++ 00-开发准备篇_snmp++_12

图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++ 00-开发准备篇_编译_13


要成功地与本地SNMP代理进行通信,除了该工程外,你还需要对本地 SNMP代理进行配置(可参考本文相关部分)。