win获取正在使用的网卡信息

本文介绍了如何通过C++代码获取计算机已连接网卡的IP地址,利用MIB_IPFORWARDTABLE获取路由表信息,并获取网卡的MAC地址。展示了Windows系统中网络配置的底层操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、获取目前已连接网卡IP

    WORD w = MAKEWORD(1, 1);
	WSADATA wsaData;
	WSAStartup(w, &wsaData); // 加载套接字库

	struct hostent *host_info = gethostbyname("");
	in_addr PcAddr;
	for (int i=0;;i++)
	{
		char *p = host_info->h_addr_list[i];
		if (NULL==p)
		{
			break;
		}

		memcpy(&(PcAddr.S_un.S_addr),p,host_info->h_length);
		char*szIP = ::inet_ntoa(PcAddr);
		printf("ip地址:%s\n",szIP);

	}

	WSACleanup();

二、获取正在使用的网卡信息

void CClientDlg::FreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)
{
	if (pIpRouteTab != NULL)
	{
		::GlobalFree(pIpRouteTab);
		pIpRouteTab = NULL;
	}
}

PMIB_IPFORWARDTABLE CClientDlg::GetIpForwardTable(BOOL bOrder)
{
	PMIB_IPFORWARDTABLE pIpRouteTab = NULL;
	DWORD dwActualSize = 0;

	// 查询所需缓冲区的大小  
	if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
	{
		// 为MIB_IPFORWARDTABLE结构申请内存  
		pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
		// 获取路由表  
		if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)
			return pIpRouteTab;
		::GlobalFree(pIpRouteTab);
	}
	return NULL;
}
std::string CClientDlg::GetSystemIpAddress()
{
	std::string strLoalhostIp;
	PMIB_IPFORWARDTABLE pIpRouteTable = GetIpForwardTable(TRUE);
	if (pIpRouteTable != NULL)
	{
		DWORD  dwCurrIndex;
		struct in_addr inadDest;
		struct in_addr inadMask;
		struct in_addr inadGateway;
		char szDestIp[128] = { 0 };
		char szMaskIp[128] = { 0 };
		char szGatewayIp[128] = { 0 };
		DWORD IfIndex = 0;
		DWORD ForwardMetric1 = 0;
		if (pIpRouteTable->dwNumEntries > 0)
		{
			int i = 0;
			for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
			{
				dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;
				// 目的地址  
				inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
				strcpy_s(szDestIp, sizeof(szDestIp), inet_ntoa(inadDest));
				// 子网掩码  
				inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;
				strcpy_s(szMaskIp, sizeof(szDestIp), inet_ntoa(inadMask));
				// 网关地址  
				inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;
				strcpy_s(szGatewayIp, sizeof(szDestIp), inet_ntoa(inadGateway));
				if ((strcmp(szDestIp, "0.0.0.0") == 0) && (strcmp(szMaskIp, "0.0.0.0") == 0))
				{

					if (i == 0)
					{
						ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;
						IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;
						struct in_addr inadDest;
						inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
					}
					else if (ForwardMetric1 > pIpRouteTable->table[i].dwForwardMetric1)
					{
						ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;
						IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;
						struct in_addr inadDest;
						inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
					}
				}
			}
		}
		else
		{
			FreeIpForwardTable(pIpRouteTable);
			return "";
		}
		FreeIpForwardTable(pIpRouteTable);


		if (IfIndex > 0)
		{
			DWORD ipdwSize = 0;
			PBYTE m_pBuffer = new BYTE[MAX_PATH];
			ULONG m_ulSize = MAX_PATH;
			DWORD m_dwResult;
			PMIB_IPADDRTABLE pAddrTable;
			PMIB_IPADDRROW pAddrRow;
			in_addr ia;
			GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);
			delete[] m_pBuffer;
			m_pBuffer = new BYTE[m_ulSize];
			if (NULL != m_pBuffer)
			{
				m_dwResult = GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);
				if (m_dwResult == NO_ERROR)
				{
					pAddrTable = (PMIB_IPADDRTABLE)m_pBuffer;

					for (int x = 0; x < pAddrTable->dwNumEntries; x++)
					{
						pAddrRow = (PMIB_IPADDRROW) &(pAddrTable->table[x]);

						ia.S_un.S_addr = pAddrRow->dwAddr;
						char IPMsg[100] = { 0 };
						if (IfIndex == pAddrRow->dwIndex)
						{
							LPCSTR psz = inet_ntoa(ia);
							if (psz)
							{
								strLoalhostIp = psz;
							}
							delete[] m_pBuffer;
							return strLoalhostIp;
						}
					}
				}
				delete[] m_pBuffer;
			}
		}
	}
	else
	{
		FreeIpForwardTable(pIpRouteTable);
		return 0;
	}
	return 0;
}

三、获取正在使用的网卡MAC地址

        实际测试,有线网卡未连接时仍被获取到。

wstring CClientDlg::GetNetInfoFromRegister()
{
	wstring wstrRet;
	TCHAR szMac[MAX_PATH] = { 0 };
	int nBuffSize = MAX_PATH;
	wstring nError;
	if (szMac == NULL || nBuffSize < 18) 
		return nError;

	HKEY hKey = NULL;
	HKEY hKey2 = NULL;
	TCHAR szKey[MAX_PATH], szBuffer[MAX_PATH];
	TCHAR szServiceName[MAX_PATH];
	TCHAR szFileName[MAX_PATH] = { 0 };
	DWORD dwRet = 0;
	DWORD dwType = 0;
	DWORD cbData = 0;
	DWORD cName = _countof(szBuffer);
	if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"), &hKey) != ERROR_SUCCESS)
		return nError;

	for (int i = 0; RegEnumKeyEx(hKey, i, szBuffer, &cName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, cName = _countof(szBuffer))
	{
		_tcscpy_s(szKey, MAX_PATH, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"));
		_tcscat_s(szKey, MAX_PATH, szBuffer);
		if (RegOpenKey(HKEY_LOCAL_MACHINE, szKey, &hKey2) != ERROR_SUCCESS)
		{
			continue;
		}

		dwType = REG_SZ;
		cbData = MAX_PATH * sizeof(TCHAR);
		if (RegQueryValueEx(hKey2, _T("ServiceName"), NULL, &dwType, (LPBYTE)szServiceName, &cbData) == ERROR_SUCCESS)
		{
			//读取成功后关闭句柄
			RegCloseKey(hKey2);

			_tcscpy_s(szFileName, MAX_PATH, _T("\\\\.\\"));
			_tcscat_s(szFileName, MAX_PATH, szServiceName);
			HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
			if (hFile != INVALID_HANDLE_VALUE) {
				DWORD dwInBuff = 0x01010101;
				BYTE outBuff[MAX_PATH];
				dwRet = DeviceIoControl(hFile, 0x00170002, &dwInBuff, sizeof(dwInBuff), outBuff, sizeof(outBuff), &cbData, NULL);

				//无论成功失败关闭文件句柄
				CloseHandle(hFile);
				hFile = INVALID_HANDLE_VALUE;

				if (dwRet)
				{
					_stprintf_s(
						szMac, nBuffSize / sizeof(TCHAR),
						_T("%02X-%02X-%02X-%02X-%02X-%02X"),
						outBuff[0], outBuff[1], outBuff[2],
						outBuff[3], outBuff[4], outBuff[5]
					);
					break;
				}
			}
		}
		else
		{
			//读取失败关闭句柄
			RegCloseKey(hKey2);
		}
	}//end for
	if (hKey != NULL)
	{
		RegCloseKey(hKey);
	}
	//std::string MAC;
	int iLen = WideCharToMultiByte(CP_ACP, 0, szMac, -1, NULL, 0, NULL, NULL);
	char* chRtn = new char[iLen * sizeof(char)];
	WideCharToMultiByte(CP_ACP, 0, szMac, -1, chRtn, iLen, NULL, NULL);
	//MAC = chRtn;
	//return MAC;
	wstrRet = AnsiToUnicode(chRtn);
	return wstrRet;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古道青阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值