随着上次的snmp_pp.lib文件的编译成功,我对于SNMP++的学习得以进一步学入,这次是学习SNMP++软件包中的各种类,它们分别是Oid类、IpAddress和UdpAddress类、Vb类、Pdu类、Snmp类,通过对这几种类的学习,最终我们可以通过SNMP++对支持SNMP管理的网络设备(如CISCO的交换机)进行SNMP操作(比如GET等)。
一、 自娱自乐的Oid类、IpAddress和UdpAddress类
为什么这么说,因为这两种类操作时没有网络通信的操作,Oid类主要作用就是构造Oid对象。我们可以通过snmp_pp.doc文件中提供的例子学习该类的使用(snmp_pp.doc是什么,就是官方的使用手册,从百度上可以找到中文翻译版,从www.yahoo.com上可以找到英文的原版,我把两个版本都下载下来了,对照着看收获很大)。Snmp_pp.doc文档中提供的例子太长了,为了让大家有耐心把源代码敲进去,我打算把这个例子分成两部分,一部分是一个最基本的Oid例子,另一部分是比较完整的例子。
1、 基本的Oid例子
在此我对于在VC++6.0中的操作也作一个简要的说明
1)新建一个Win32 ConsoleApplication程序,取名为snmpoid1,如图1所示:
图1
2)新建一个C++源程序,取名为snmpoid1,并添加到工程snmpoid1中,如图2所示:
图2
3)为了翻译时不出一大堆错误,我们需要在“Project”-“Settings”-“Link”中进行一些必要的设置,一是在“Object/librarymodules:”中添加snmp_pp.lib和ws2_32.lib,二是在“ProjectOptions”中添加/nodefaultlib:libcmtd,如图3所示:
图3
4)源程序及运行结果如图4所示:
图4
2、 完整的Oid例子
有了上面的基础,我们已经可以确认我们有能力在VC++6.0中使用SNMP++的Oid类了,所以不妨全面的了解一下Oid类。源代表码如下(需要说明一点,这个源程序的最后一部分我没有调试通过,所以把它注释起来了,如果有谁知道sprintf这条语句怎么用,一定要告诉我一声啊):
#include "snmp_pp.h"
#include "oid.h"
#include
//#include
//#include
//#include
//#include
void main()
{
// construct an Oid with adotted string and print it out
//用点分八进制定义一个Oid并输出它
Oido1("1.2.3.4.5.6.7.8.9.1");
cout << "o1= " <<o1.get_printable ()<
// construct an Oid withanother Oid and print it out
//用一个Oid定义另一个Oid并输出它
Oid o2(o1);
cout << "o2= " <<o2.get_printable()<
// trim o2's last value andprint it out
//trim的作用是删除Oid最右边的n个子单元,默认是1个,从输出的结果看最右边的1被删掉了
o2.trim(1);
cout << "o2= " <<o2.get_printable()<
// add a 2 value to the end ofo2 and print it out
//把2这个值加到o2后面并输出它
o2+=2;
cout << "o2= " <<o2.get_printable()<
// create a new Oid, o3
//定义一个新的Oid,o3
Oid o3;
// assign o3 a value and printit out
//定义o3的值并输出它
o3="1.2.3.4.5.6.7.8.9.3";
cout << "o3= " <<o3.get_printable()<
// create o4
//创建一个Oid,o4
Oid o4;
// assign o4 o1's value
//用o1来定义o4的值
o4=o1;
// trim off o4 by 1
//删除o4最右边的一个值
o4.trim(1);
// concat a 4 onto o4 andprint it out
//o4后面加上".4"并输出
o4+=".4";
cout << "o4= " <<o4.get_printable()<
// make o5 from o1 and printit out
//用o1来定义并输出它
Oid o5(o1);
cout << "o5= " <<o5.get_printable()<
// compare two not equaloids
//比较两个oid的值是否相等,因为o1的最后一个为1,o2的最后一位为2,所以不相等
if(o1==o2) cout << "O1EQUALS O2"<
else cout<< "o1 not equal to o2"<
// print out a piece ofo1
//输出o1的一片,strval的作用是get string value of avariable,结合到本例是取1-3
cout << "strval(3) of O1= " << o1.get_printable(3)<
// print out a piece ofo1
//输出从左边数1至3
cout << "strval(1,3) ofO1 = " << o1.get_printable(1,3)<
// set o1's last subid
o1[ o1.len()-1] = 49;
cout << "O1 modified = "<< o1.get_printable()<
// set o1's 3rd subid
o1[2]=49;
cout << "O1 modified = "<< o1.get_printable()<
// get the last subid of02
cout << "last of o2 = "<< o2[o2.len()-1]<
// get the 3rd subid of02
cout << "3rd of o2 = "<< o2[2]<
// ncompare
//ncompare的作用是从左至右比较oid的前n个子单元,因为本例中o1与o2有三个单元相同,所以输出“==”
if (o1.nCompare(3,o2))
cout << "nCompare o1,o2,3 =="<
else
cout << "nCompare o1,o2,3 !="<
// make an array of oids
Oid oids[30]; int w;
for (w=0;w<30;w++)
{
oids[w] = "300.301.302.303.304.305.306.307";
oids[w] += (w+1);
}
/*for (w=0;w<25;w++)
{
sprintf( msg,"Oids[%d] = %s",w, oids[w].get_printable());
printf("%s",msg, strlen(msg));
}*/
}
3、IpAddress和UdpAddress类
1)第一个源程序代码:
#include "snmp_pp.h"
#include
void main()
{
GenAddressaddress1("10.4.8.5"); // make an IP GenAddress生成一个GenAddress IP地址
cout<<
GenAddressaddress2("01020304-10111213141516"); // make an IPX GenAddress
cout<<
GenAddressaddress3("01:02:03:04:05:06"); // make a MAC GenAddress生成一个GenAddress MAC地址
cout << address3.get_printable()<
if (!address1.valid()) // check validity
cout<< "address1 ! valid";
}
运行结果如图5所示
图5
2)第二个程序源代码
// address class examples
#include
#include "snmp_pp.h"
#include "address.h"
void main()
{
//--------------[ IPAddressconstruction]------------------------------------------------------
IpAddressip1(""); //makes an invalid IpAddress object,如果是写成Ipaddressip1();那就是不能为ip1赋值,但是
//如果写成IpAddressip1("");,就可以为ip1赋值
IpAddressip2("10.4.8.5"); // makes a IpAddress verifies dotted format
//用点分十进制的形式定义了IpAddress ip2
IpAddressip3(ip2); //makes an IpAddress using another IpAddress
//用ip2定义ip3
IpAddressip4("trout.rose.hp.com"); // makes an IpAddress does DNS on string
cout<< "ip2="<
cout << "ip3="<
cout << "ip4="<
//--------------[ MAC Addressconstruction]-----------------------------------------------------
MacAddressmac1(""); //makes an invalid MAC address同样的道理,在括号里加入了""可以为mac1赋值了
MacAddressmac2("08:09:12:34:52:12"); // makes and verifies a MAC address
//定义了MacAddress mac2
MacAddressmac3(mac2); // makes a MAC fromanother MAC
//用mac2定义了mac3
cout<<"mac2="<
cout<<"mac3="<
//从输出结果看mac2和mac3是一样的
//---------------[ Gen Address Construction]-----------------------------------------------------
GenAddress addr1("10.4.8.5"); //定义了GenAddressaddr1
GenAddress addr2("01020304:050607080900");//定义了GenAddress addr2
cout<<"addr1="<
cout<<"addr2="<
//---------------[ assigning Addresses]------------------------------------------------------------
ip1="15.29.33.10";
cout<<"ip1="<
// ipx1 ="00000001-080912345212";
mac1 ="08:09:12:34:52:12";
cout<<"mac1="<
}
输出结果如图6所示
图6