BOOL getvalue(CString& oidStr,CString& ipAdressStr,CString& valueStr)
第一个参数 oidStr表示MIB中需要采集对象的OID值,第二个参数ipAddressStr表示采集目标的IP地址。第三个参数valueStr用来存放采集得到的数据。三个参数的类型均为CString&。函数返回值为BOOL型,如果采集成功返回TRUE,否则返回FALSE。
BOOL getvalue(CString& oidStr,CString& ipAdressStr,CString& valueStr)
{
int status;
Snmp snmp( status); // check construction status
if ( status != SNMP_CLASS_SUCCESS)
{
CString temp="SNMP++ Session Create Fail, ";
temp+=snmp.error_msg(status);
AfxMessageBox(temp);
return FALSE;
}
//--------[ build up SNMP++ object needed ]-------------------------------
Pdu pdu; // construct a Pdu object
Vb vb; // construct a Vb object
Oid oid(oidStr);
IpAddress ipaddress(ipAdressStr);
if(!oid.valid())
{
AfxMessageBox("oid非法");
return FALSE;
}
if(!ipaddress.valid())
{
AfxMessageBox("IP地址非法");
return FALSE;
}
vb.set_oid(oid);// set the Oid portion of the Vb
pdu += vb; // add the vb to the Pdu
CTarget target(ipaddress); // make a target using the address
target.set_version( version2c); // set the SNMP version SNMPV1 or V2
target.set_retry( 1); // set the number of auto retries
target.set_timeout( 100); // set timeout
target.set_readcommunity( "public"); // set read community
target.set_writecommunity( "public");// set the write community name
//-------[ issue the request, blocked mode ]-----------------------------
if ( (status = snmp.get( pdu, target)) != SNMP_CLASS_SUCCESS)
{
AfxMessageBox(snmp.error_msg( status));
return FALSE;
}
else
{
processPos+=procSpan;
pdu.get_vb( vb,0); // extract the variable binding
valueStr=vb.get_printable_value();
} // print out
return TRUE;
};
为了减少采集时发送的请求PDU数据报数,尽量减少对网络通信的影响,同时提供友好的通用性接口而设计的。在数据采集过程中方便使用,该子功能模块和以上不同之处是为Pdu变量绑定了多个OID,在绑定变量中分别取出其对应的值,并把取得的值赋值给CStringArray类型的字符串变量,第一个参数表示采集目标的IP地址,第二个参数为绑定变量数组,在初始化时和多个OID绑定,第三个参数用来存储返回的采集数据。实现主要代码如下:
void get_group(CString &strIP,Vb vbs[],CStringArray& valuestr,int oidNum)
{
CTarget target((IpAddress) strIP);
……//在target上设置SNMP版本,重试次数,超时时间,共同体名
Pdu pdu;
pdu.set_vblist(vbs,oidNum);//设置多个绑定变量
int status;
Snmp snmp( status);
if ( status != SNMP_CLASS_SUCCESS)
{
AfxMessageBox( snmp.error_msg( status));
return;
}
if ((status = snmp.get(pdu, target)) != SNMP_CLASS_SUCCESS)
AfxMessageBox(snmp.error_msg( status));//如果不成功则提出错误信息
else
{
processPos+=procSpan;
pdu.get_vblist(vbs,oidNum);//取出多个绑定变量
for ( int w=0;w<oidNum;w++)
valuestr.Add(vbs[w].get_printable_value( ));//对绑定变量中分别取出值
}
}