獲取當前網卡的ip,mac等基本信息

在多網卡環境下,我們怎麼來獲取自己當前使用的網卡信息了?
通過判斷網關,因爲多網卡一次也只能一個網卡上網,能上網的網卡肯定存在網關

bool GetIPAndGateWay(std::string& strIp, std::string& strMac, std::string& strGateWay, std::string &strGateWayMac)
{
	strIp = "";
	strGateWay = "";
	strMac = "";
	strGateWayMac = "";
	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter = NULL;
	DWORD errValue = 0;
	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
	pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
	if (!pAdapterInfo)//malloc失敗
		return false;
	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) //空間不夠,重新分配
	{
		free(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
		if (!pAdapterInfo) //malloc失敗
			return false;
	}
	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR)
	{
		pAdapter = pAdapterInfo;
		while (pAdapter)
		{
			CString mac;
			mac.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"), pAdapter->Address[0], pAdapter->Address[1], \
				pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5]);
			strMac = mac;
			strIp = pAdapter->IpAddressList.IpAddress.String;
			strGateWay= pAdapter->GatewayList.IpAddress.String;
			if (strGateWay!= "0.0.0.0")
				break;

			pAdapter = pAdapter->Next;
		}
	}
	else
	{
		return false;
	}
	if (pAdapterInfo)
		free(pAdapterInfo);

	GetGateWayMac(strGateWay, strGateWayMac);
	return true;
}

void GetGateWayMac(const std::string &strip, std::string &strmac)
{
	if (strip.empty()) return;
	strmac = "";
	ULONG uSize = 0;
	PMIB_IPNETTABLE pIpNetTable = nullptr;
	DWORD dwRet = GetIpNetTable(pIpNetTable, &uSize, false);
	if (dwRet == ERROR_INSUFFICIENT_BUFFER)
	{
		pIpNetTable = (PMIB_IPNETTABLE)malloc(uSize);
		if (NO_ERROR == GetIpNetTable(pIpNetTable, &uSize, false))
		{
			PMIB_IPNETROW pIpNetRow = pIpNetTable->table;
			in_addr inaddr;
			for (int k = 0; k < pIpNetTable->dwNumEntries; ++k)
			{

				char szIp[32] = "", szMac[64] = "";
				//IP地址
				inaddr.S_un.S_addr = pIpNetRow[k].dwAddr;
				strcpy(szIp, inet_ntoa(inaddr));

				if (strip != szIp) continue;
				//過濾Mac爲空的
				if (pIpNetRow[k].dwPhysAddrLen <= 0) continue;
				UCHAR bPhysAddr[MAXLEN_PHYSADDR] = { 0 };
				if (0 == memcmp(pIpNetRow[k].bPhysAddr, bPhysAddr, pIpNetRow[k].dwPhysAddrLen)) continue;
				//MAC地址
				for (int j = 0; j < pIpNetRow[k].dwPhysAddrLen; j++)
				{
					if (lstrcmp(szMac, "") == 0)
						sprintf(szMac, "%02x", pIpNetRow[k].bPhysAddr[j]);
					else
						sprintf(szMac, "%s-%02x", szMac, pIpNetRow[k].bPhysAddr[j]);
				}
				strmac = szMac;
				break;
			}
		}
	}

	if (pIpNetTable)
		free(pIpNetTable);

}

在這裏插入圖片描述
參考博客:
https://blog.csdn.net/yangyang031213/article/details/64906437

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章