簡單網路管理協議(SNMP)通過第三方API SNMP++ 提取程序名稱,路徑與PID資訊
阿新 • • 發佈:2019-02-12
書接上文,在此部落格中記錄獲取程序名稱,路徑與PID資訊的子函式
上篇部落格中記錄了初始定義的結構體與其他變數的定義。直接上程式碼段:
/*=========================================================== 函式名稱:Get_Per_CPU_PID 函式功能:獲取程序PID,將程序PID資訊傳送到程序資訊結構體陣列的元素當中 函式引數:const char * aa1:主機地址:監聽埠("127.0.0.1:161"); const char * bb1:OID,MIB資料型別,指定為"public" Process Pro[]:程序資訊結構體陣列; 返回值: 無返回值 =============================================================*/ void Get_Per_CPU_PID(const char * aa1, const char * bb1, Process Pro[]) { Snmp::socket_startup(); //初始化Winsocket套接字 UdpAddress udp(aa1); CTarget ctarget(udp); ctarget.set_readcommunity(bb1); snmp_version version = version2c; ctarget.set_version(version); SnmpTarget *target; target = &ctarget; int status; Snmp snmp(status, 0, false); // 建立snmp物件 int i = 0; int index_count = 0; //該列的行數 bool tag = true; //標誌迴圈是否結束 Pdu pdu; Vb vb; Oid oid = ".1.3.6.1.2.1.25.4.2.1.4";//初始Oid 表示ipNetToMediaTable 中ipNetToMediaNetAddress vb.set_oid(oid); pdu += vb; do { if ((status = snmp.get_next(pdu, *target)) == SNMP_CLASS_SUCCESS) {//讀完資料後,指標會指向該列下一個表項 pdu.get_vb(vb, 0); Oid soid; vb.get_oid(soid);//當前列的Oid if (oid.nCompare(oid.len(), soid) == 0) {//當前soid與初始oid相等則取資料,即只能是初始oid那一列資料 vb.get_oid(full_oid[index_count]);//將該所有列表項的oid(oid+index)賦值給full_oid陣列備用 Pro[index_count].OID = full_oid[index_count]; strcpy(Pro[index_count].PID, Pro[index_count].OID.get_printable(1)); index_count++; } else{//oid超過該列,跑到下一列。 tag = false; } } else{// get_next讀取失敗 tag = false; } } while (tag == true); Snmp::socket_cleanup(); //初始化Winsocket套接字 } /*=========================================================== 函式名稱:Get_Per_CPU_Name 函式功能:獲取程序名稱,將程序名稱傳送到程序資訊結構體陣列的元素當中 函式引數:const char * aa1:主機地址:監聽埠("127.0.0.1:161"); const char * bb1:OID,MIB資料型別,指定為"public" Process Pro[]:程序資訊結構體陣列; 返回值: 無返回值 =============================================================*/ void Get_Per_CPU_Name(const char * aa1, const char * bb1, Process Pro[]) { char bb[50] = { 0 }; Snmp::socket_startup(); //初始化Winsocket套接字 UdpAddress udp(aa1); CTarget ctarget(udp); ctarget.set_readcommunity(bb1); snmp_version version = version2c; ctarget.set_version(version); SnmpTarget *target; target = &ctarget; int status; Snmp snmp(status, 0, false); // 建立snmp物件 int i = 0; int index_count = 0; //該列的行數 bool tag = true; //標誌迴圈是否結束 Pdu pdu; Vb vb; Oid oid = ".1.3.6.1.2.1.25.4.2.1.2";//初始Oid 表示ipNetToMediaTable 中ipNetToMediaNetAddress vb.set_oid(oid); pdu += vb; Oid full_oid[200];//用於儲存一列的oid,由於有多少條記錄未知(行數未知)所以儘量設定大 do { if ((status = snmp.get_next(pdu, *target)) == SNMP_CLASS_SUCCESS) {//讀完資料後,指標會指向該列下一個表項 pdu.get_vb(vb, 0); Oid soid; vb.get_oid(soid);//當前列的Oid if (oid.nCompare(oid.len(), soid) == 0) {//當前soid與初始oid相等則取資料,即只能是初始oid那一列資料 vb.get_oid(full_oid[index_count]);//將該所有列表項的oid(oid+index)賦值給full_oid陣列備用 cout << "IpAddress = " << vb.get_value(bb) << " end" << endl; vb.get_value(Pro[index_count].name); index_count++; } else{//oid超過該列,跑到下一列。 tag = false; } } else{// get_next讀取失敗 tag = false; } } while (tag == true); Snmp::socket_cleanup(); //初始化Winsocket套接字 } /*=========================================================== 函式名稱:Get_Per_CPU_Path 函式功能:獲取程序路徑,將路徑資訊傳送到程序資訊結構體陣列的元素當中 函式引數:const char * aa1:主機地址:監聽埠("127.0.0.1:161"); const char * bb1:OID,MIB資料型別,指定為"public" Process Pro[]:程序資訊結構體陣列; 返回值: 無返回值 =============================================================*/ void Get_Per_CPU_Path(const char * aa1, const char * bb1, Process Pro[]) { Snmp::socket_startup(); //初始化Winsocket套接字 UdpAddress udp(aa1); CTarget ctarget(udp); ctarget.set_readcommunity(bb1); snmp_version version = version2c; ctarget.set_version(version); SnmpTarget *target; target = &ctarget; int status; Snmp snmp(status, 0, false); // 建立snmp物件 int i = 0; int index_count = 0; //該列的行數 bool tag = true; //標誌迴圈是否結束 Pdu pdu; Vb vb; Oid oid = ".1.3.6.1.2.1.25.4.2.1.4";//初始Oid 表示ipNetToMediaTable 中ipNetToMediaNetAddress vb.set_oid(oid); pdu += vb; //Oid full_oid[200];//用於儲存一列的oid,由於有多少條記錄未知(行數未知)所以儘量設定大 do { if ((status = snmp.get_next(pdu, *target)) == SNMP_CLASS_SUCCESS) {//讀完資料後,指標會指向該列下一個表項 pdu.get_vb(vb, 0); Oid soid; vb.get_oid(soid);//當前列的Oid if (oid.nCompare(oid.len(), soid) == 0) {//當前soid與初始oid相等則取資料,即只能是初始oid那一列資料 vb.get_oid(full_oid[index_count]);//將該所有列表項的oid(oid+index)賦值給full_oid陣列備用 cout << "IpAddress = " << vb.get_value(Pro[index_count].Path) << " end" << endl; vb.get_value(Pro[index_count].Path); index_count++; } else{//oid超過該列,跑到下一列。 tag = false; } } else{// get_next讀取失敗 tag = false; } } while (tag == true); Snmp::socket_cleanup(); //初始化Winsocket套接字 }