1. 程式人生 > >簡單網路管理協議(SNMP)通過第三方API SNMP++ 提取程序名稱,路徑與PID資訊

簡單網路管理協議(SNMP)通過第三方API SNMP++ 提取程序名稱,路徑與PID資訊

書接上文,在此部落格中記錄獲取程序名稱,路徑與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套接字
}