const string & SnmpDG::GetMibObject(const snmp_version version, const SnmpPara& spr, const string oid) const { if(!m_inited_success) { return m_empty_object; } Snmp::socket_startup(); UdpAddress address(spr.ip.c_str()); //string myoid = oid; Pdu pdu; Vb vb; vb.set_oid(oid.c_str());//(myoid.c_str()); pdu += vb; CTarget ctarget(address); ctarget.set_version( version ); ctarget.set_retry(spr.retry); ctarget.set_timeout(spr.timeout); ctarget.set_readcommunity(spr.community.c_str()); SnmpTarget *target; target = &ctarget; int status; Snmp snmp(status, 0, false); if (status == SNMP_CLASS_SUCCESS) { if ((status = snmp.get( pdu, *target)) == SNMP_CLASS_SUCCESS) { pdu.get_vb( vb,0); //string oid_tmp = vb.get_printable_oid(); m_mib_object = vb.get_printable_value(); } else { m_mib_object = string(""); SetLastError(status); } } else { m_mib_object = string(""); SetLastError(status); } Snmp::socket_cleanup(); // Shut down socket subsystem return m_mib_object; }
Status SnmpManager::handleOperationGetNext(Request *request) { Snmp::socket_startup(); int status; Snmp snmp(status, 0, false); if (status != SNMP_CLASS_SUCCESS) { /*Setup SNMP FAILED*/ Helper::log(0, "RequestGetNext Failed"); Helper::log(1, snmp.error_msg(status)); Helper::pop("Error", snmp.error_msg(status)); Snmp::socket_cleanup(); return Status_FAILED; } Pdu pdu; pdu += request->data; CTarget ctarget(request->address); ctarget.set_retry(request->retry); ctarget.set_timeout(request->timeout); ctarget.set_version(request->version); ctarget.set_readcommunity(request->community.c_str()); SnmpTarget *target = &ctarget; status = snmp.get_next(pdu, *target); if (status == SNMP_CLASS_SUCCESS) { /*GetNextRequest SUCCESS*/ Helper::log(1, "RequestGetNext SUCCESS"); pdu.get_vb(request->data, 0); QString replayOid = request->data.get_printable_oid(); QString replayValue = request->data.get_printable_value(); } else { /*GetNextRequest FAILED*/ Helper::log(0, "RequestGetNext Failed"); Helper::log(1, snmp.error_msg(status)); Helper::pop("Error", snmp.error_msg(status)); Snmp::socket_cleanup(); return Status_FAILED; } Snmp::socket_cleanup(); qDebug() << "########################################################"; qDebug() << "Handle RequestGetNext Successfully"; qDebug() << "Oid: " << request->data.get_printable_oid(); qDebug() << "Value: " << request->data.get_printable_value(); qDebug() << "########################################################"; return Status_SUCCESS; }
const list<pair<string,string> > & SnmpDG::GetMibTable(const snmp_version version, const SnmpPara& spr, const string oid) const { m_mib_table.clear(); if(!m_inited_success) { return m_mib_table; } Snmp::socket_startup(); // Initialize socket subsystem UdpAddress address( spr.ip.c_str()); Oid myoid(oid.c_str()); // default is sysDescr if( !myoid.valid()) {// check validity of user oid return m_mib_table; } Pdu pdu; // construct a Pdu object Vb vb; // construct a Vb object(SNMP++ Variable Binding) vb.set_oid(myoid);//oid.c_str()); pdu += vb; CTarget ctarget(address); ctarget.set_version( version ); ctarget.set_retry(spr.retry); ctarget.set_timeout(spr.timeout); ctarget.set_readcommunity(spr.community.c_str()); SnmpTarget *target; target = &ctarget; int status; Snmp snmp(status, 0, false); if (status == SNMP_CLASS_SUCCESS) { DWORD dwStartTime_ttl = GetTickCount(); DWORD dwStartTime = 0, dwEndTime = 0; while ( (status = snmp.get_next(pdu, *target)) == SNMP_CLASS_SUCCESS) //get_next命令是按列遍历oid { pdu.get_vb(vb, 0); Oid oid_tmp = vb.get_oid();//.get_printable_oid();该表项的oid string str_oid_tmp = oid_tmp.get_printable(); if(oid_tmp.nCompare(myoid.len(), myoid) != 0)//判断是否已越界,如果是则结束循环 { break; } bool bNew = true; string value_tmp = vb.get_printable_value(); for(std::list<pair<string,string> >::iterator item = m_mib_table.begin(); item != m_mib_table.end(); item++) { if(item->first == str_oid_tmp)//value_tmp)//去掉重复的oid { bNew = false; cout << "ip:" + spr.ip + ",repeat oid:" + str_oid_tmp; break; } } if(bNew) { dwStartTime = GetTickCount(); m_mib_table.push_back(make_pair(str_oid_tmp,value_tmp)); vb.set_oid(oid_tmp); vb.set_null(); pdu.set_vb(vb,0); } else { // if ( GetTickCount() - dwStartTime > 10000 ) //10s //{ // cout << "Timeout because read repeat data " << endl; break; //} } if ( GetTickCount() - dwStartTime_ttl > 300000 ) //5min { cout << "Timeout because read operation " << endl; break; } } } else { cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "\n"; SetLastError(status); } Snmp::socket_cleanup(); // Shut down socket subsystem return m_mib_table; }