- 下载SNMP++开发包,官网地址:http://www.agentpp.com/,目前最新的版本为snmp++-3.4.5.tar.gz,如果需要支持V3版本的数据传输功能,还需要下载libdes,目前的版本为libdes-l-4.01a.tar.gz。还要下载MS VC++12 Project Files for SNMP++,因为源码中没有项目文件。
- 将下载的三个压缩包解压之后的文件夹放在同级目录下,同时将snmp++-3.4.5重命名为snmp++,将vs2013重新命名为vs2015
- 在vs2015文件夹中有四个文件夹,其中需要用到的就两个libdes和SNMP++,可以删掉AGENT++和AgentX++。
- 进入.\vs2015\libdes文件夹中,双击libdes.sln文件,默认自己会加载对应的.h头文件和.c源文件,
- 直接右键项目名,开始build,编译成功
- 会在debug文件夹下生成对应的libdes.lib库文件。
- 同时还可以生成release版本的libdes.lib库文件
- 用..\vs2015\SNMP++\include\snmp_pp\config_snmp_pp.h替换掉..\snmp++\include\snmp_pp\config_snmp_pp.h同名文件,替换的原因在./vs2015目录下的README.win32文件中有说明
- 进入./vs2015/SNMP++路径下,双击SNMP++.sln文件,打开工程。
- 右键项目名“SNMP++”,开始Build,会产生如下错误,
- 缺少的头文件libsnmp.h文件在.\vs2015\SNMP++\include目录下,右键工程名打开属性对话框,将此目录添加到Include Directories中,
可以发现,在打开的Include Directories对话框中,配置路径有问题, 根据自己项目的情况配置正确的路径,
此处依然使用的是绝对路径,如果熟悉【$(SolutionDir)】的用法的化,也可以使用相对路径替代。
- 右键项目名,重新Build,发现生成如下错误,
1)关于pp_int64的错误,出现在usm_v3.cpp文件中,可以换成int64_t,
这种修改是否会产生其它问题,目前尚不知晓。
2)use inet_pton() or InetPton() instead…错误,按照错误提示,在工程属性C/C++->预处理器中添加_WINSOCK_DEPRECATED_NO_WARNINGS
- 然后重新Build,此时即可编译成功,
成功后会在Debug路径下生成SNMP++.lib库文件。
- 新建测试项目
新建win32控制台应用程序TestSNMP
为了方便引用头文件和lib库,新建文件夹SNMPLIB,将./snmp++/include/snmp_pp整个文件夹及其内容拷贝到./SNMPLIB目录下。同时将./libdes中的头文件也拷贝到./SNMPLIB路径下,最后将libdes.lib和SNMP++.lib两个库文件也拷贝到./SNMPLIB路径下。
- 设置TestSNMP属性的包含路径和库路径
- 在项目属性中的连接器的input属性中输入lib库的文件名
测试程序源码如下,
#include <iostream>
#include "snmp_pp/snmp_pp.h"
using namespace std;
using namespace Snmp_pp;
#define SYSDESCR "1.3.6.1.2.1.1.1.0" //Object ID for System Descriptor
void get_system_descriptor()
{
Snmp::socket_startup();
int status; //返回状态
CTarget ctarget((IpAddress)"127.0.0.1");
Vb vb(SYSDESCR); //SNMP++变量绑定
Pdu pdu; //SNMP++ pdu
//构造SNMP对象
Snmp snmp(status);
//创建SNMP session
if (status != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);
return;
}
//
pdu += vb; //绑定变量
if ((status = snmp.get(pdu, ctarget)) != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);
}
else
{
pdu.get_vb(vb, 0); //
cout << "System Descriptor = " << vb.get_printable_value();
}
Snmp::socket_cleanup();
}
int main()
{
get_system_descriptor();
return 0;
}
编译运行,结果如下,
参考来源:
1、https://www.cnblogs.com/lidabo/p/7567469.html