windows獲取物理網卡的IP地址和MAC地址(排除虛擬網卡)

windows有虛擬網卡或多個網卡的情況下,很難判斷本機IP到底用的哪一個網卡上的IP,也難以區分虛擬網卡和物理網上。

這裏我們使用windows的函數GetBestInterface(destIP,index), 系統會給一個到指定IP地址的最適合的網卡的序列號,通過這個序列號再遍歷各個網卡就可以得到當前系統所用的網卡是哪一個,如果只有一個物理網卡,也默認使用此物理網卡。

 

使用此方法需要注意, 如果電腦網絡未連接,GetBestInterface會返回失敗。只有在聯網狀態並下才會成功。

對一些需要聯網才能運行的程序來說,用這種方法是沒有問題的。

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "IPHLPAPI.lib")



int main()
{

	IPAddr add = 0x08080808;//用8.8.8.8這個IP
	DWORD index;
	auto ret = GetBestInterface(add, &index);

	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter = NULL;
	DWORD dwRetVal = 0;
	UINT i;



	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
	pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
	if (pAdapterInfo == NULL) {
		printf("Error allocating memory needed to call GetAdaptersinfo\n");
		return 1;
	}
	// Make an initial call to GetAdaptersInfo to get
	// the necessary size into the ulOutBufLen variable
	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
		free(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
		if (pAdapterInfo == NULL) {
			printf("Error allocating memory needed to call GetAdaptersinfo\n");
			return 1;
		}
	}

	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
		pAdapter = pAdapterInfo;
		while (pAdapter) {

			if (pAdapter->Index != index)
				continue;

			printf("\tComboIndex: \t5d\n", pAdapter->ComboIndex);
			printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
			printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
			printf("\tAdapter Addr: \t");
			for (i = 0; i < pAdapter->AddressLength; i++) {
				if (i == (pAdapter->AddressLength - 1))
					printf("%.2X\n", (int)pAdapter->Address[i]);
				else
					printf("%.2X-", (int)pAdapter->Address[i]);
			}
			printf("\tIndex: \t%d\n", pAdapter->Index);

			printf("\tIP Address: \t%s\n",pAdapter->IpAddressList.IpAddress.String);
			printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);
			printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
			printf("\t***\n");

			pAdapter = pAdapter->Next;
			printf("\n");
		}
	}
	else {
		printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);

	}
	if (pAdapterInfo)
		free(pAdapterInfo);



	getchar();
	return 0;
}

其他參考: 

https://docs.microsoft.com/zh-cn/windows/win32/api/iptypes/ns-iptypes-ip_adapter_info

https://blog.csdn.net/rcfsyx/article/details/9960665

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