在一篇论文上看到了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,搞定。