在一篇论文上看到了snmp++开发包使用的一个小例子,拿来调试一下。main函数主要代码如下:
#define SYSDESCR "1.3.6.1.2.1.1.1.0" //ObjectID for system descriptor
#define SYSOBJECTID "1.3.6.1.2.1.1.2.0" //ObjectID for system object ID
#define SYSCONTACT "1.3.6.1.2.1.1.4.0" //ObjectID for system contact
int main() {
int status;
Vb vb[3];
Pdu pdu;
vb[0].set_oid(SYSDESCR);
vb[1].set_oid(SYSOBJECTID);
vb[2].set_oid(SYSCONTACT);
pdu.set_vblist(vb,3);
CTarget ctarget((IpAddress) "192.168.0.1"); //被管代理的ip
Snmp snmp(status);
if((status=snmp.get(pdu, ctarget))!=SNMP_CLASS_SUCCESS)
cout<<snmp.error_msg(status);
else {
pdu.get_vblist(vb,3);
for(int i=0;i<3;i++)
cout<<vb[i].get_printable_value()<<endl;
}
return 0;
}
加入所需的头文件"snmp_pp.h"后,compile通过,build失败,报类似如下错误:
error LNK2001: unresolved external symbol "public: char const * __thiscall Vb::get_printable_value(void)const " (?get_printable_value@Vb@@QBEPBDXZ)
。。。。
fatal error LNK1120: 33 unresolved externals
查资料,原来没有引入所需库文件,引入类库:snmp_pp.lib 动态链接库:snmp_pp.dll,再rebuild,成功。
运行后没有得到正确的输出,错误输出如下:
20100928.17:39:51: 3464: (4)DEBUG : SNMPMessage: return value for build message: (0)
SNMP++: Transport operation failed
继续查资料,发现原因是由于snmp++开发包利用windows socket通信。这里自然应该先引入相关头文件和类库,再加载套接字库。最终代码如下:
#include <iostream>
#include <winsock2.h>
#include "snmp_pp.h"
using namespace std;
#define SYSDESCR "1.3.6.1.2.1.1.1.0" //ObjectID for system descriptor
#define SYSOBJECTID "1.3.6.1.2.1.1.2.0" //ObjectID for system object ID
#define SYSCONTACT "1.3.6.1.2.1.1.4.0" //ObjectID for system contact
#pragma comment(lib, "snmp_pp.lib")
#pragma comment(lib, "ws2_32.lib")
int main() {
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) {
return 1;
}
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return 1;
}
//加载结束
int status;
Vb vb[3];
Pdu pdu;
vb[0].set_oid(SYSDESCR);
vb[1].set_oid(SYSOBJECTID);
vb[2].set_oid(SYSCONTACT);
pdu.set_vblist(vb,3);
CTarget ctarget((IpAddress)"10.150.0.84");
Snmp snmp(status);
if((status=snmp.get(pdu, ctarget))!=SNMP_CLASS_SUCCESS)
cout<<snmp.error_msg(status)<<endl;
else {
pdu.get_vblist(vb,3);
for(int i=0;i<3;i++)
cout<<vb[i].get_printable_value()<<endl;
}
return 0;
}
运行结果如下:
20100928.17:44:26: 3956: (4)DEBUG : SNMPMessage: return value for build message: (0)
Hardware: x86 Family 6 Model 15 Stepping 6 AT/AT COMPATIBLE -Software: Windows
2000 Version 5.1 (Build 2600 Multiprocessor Free)
1.3.6.1.4.1.311.1.1.3.1.1
OK,搞定。