VC++获取IPV6等网卡信息

        一开始使用的是GetAdaptersInfo,不过只能获取IPV4的信息。网上一顿搜索之后发现需要用GetAdaptersAddresses。直接上代码。

#include <WinSock2.h>
#include <WS2TCPIP.H>
typedef ULONG (WINAPI *pGetAdaptersAddresses)(
	IN		ULONG                 Family,
	IN		ULONG                 Flags,
	IN		PVOID                 Reserved,
	INOUT	PIP_ADAPTER_ADDRESSES AdapterAddresses,
	INOUT	PULONG                SizePointer
);
bool GetNetworkCardMac_IPV6(char Mac[6], char *pIPAddr /*= NULL*/, int nIPBuffLen /*= 0*/)
{
	HMODULE m_hInst = LoadLibrary("Iphlpapi.dll");
	if (m_hInst < (HINSTANCE)HINSTANCE_ERROR)
	{
		m_hInst = NULL;
		return false;
	}

	pGetAdaptersAddresses fGetAdaptersAddress = (pGetAdaptersAddresses)GetProcAddress(m_hInst, "GetAdaptersAddresses");
	if (NULL == fGetAdaptersAddress)
	{
		FreeLibrary(m_hInst);
		return false;
	}
	//关于这个标志,查 MSDN 吧。。。
	ULONG flags =  0x0010 | 0x0080;//包括 IPV4 ,IPV6 网关
	ULONG family = AF_UNSPEC;//返回包括 IPV4 和 IPV6 地址
	PIP_ADAPTER_ADDRESSES pAddresses = NULL;
	ULONG outBufLen = 0;
	DWORD dwRetVal = 0;
	PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
	PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
	PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
	PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
	IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
	//IP_ADAPTER_PREFIX *pPrefix = NULL;
	outBufLen = 15000;
	do
	{
		pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(outBufLen);
		if (pAddresses == NULL)
			return false ;
		dwRetVal = fGetAdaptersAddress(family, flags, NULL, pAddresses, &outBufLen);
		if (dwRetVal == ERROR_BUFFER_OVERFLOW)
		{
			free(pAddresses);
			pAddresses = NULL;
		}
		else
			break;
	} while (dwRetVal == ERROR_BUFFER_OVERFLOW);
	CString info;
	if (dwRetVal == NO_ERROR)
	{
		pCurrAddresses = pAddresses;
		while (pCurrAddresses)
		{
			info += CString(_T("Adapter name:")) + pCurrAddresses->AdapterName + CString(_T("\r\n"));
			info += CString(_T("Description:")) + CString(pCurrAddresses->Description) + CString(_T("\r\n"));
			info += CString(_T("Friendly name:")) + CString(pCurrAddresses->FriendlyName) + CString(_T("\r\n"));
			if (pCurrAddresses->PhysicalAddressLength != 0)
			{
				CString mac;//其实 MAC 地址的长度存在 PhysicalAddressLength 中,最好用它来确定格式化的长度
				mac.Format(_T("%02X%02X%02X%02X%02X%02X"), pCurrAddresses->PhysicalAddress[0], pCurrAddresses->PhysicalAddress[1], \
					pCurrAddresses->PhysicalAddress[2], pCurrAddresses->PhysicalAddress[3], pCurrAddresses->PhysicalAddress[4], \
					pCurrAddresses->PhysicalAddress[5]);
				info += CString(_T("Adapter Mac:")) + mac + CString(_T("\r\n"));//MAC地址
			}
			CString type;
			switch (pCurrAddresses->IfType) //类型,列举了几种
			{
			case MIB_IF_TYPE_ETHERNET:
				type = _T("以太网接口");
				break;
			case MIB_IF_TYPE_PPP:
				type = _T("PPP接口");
				break;
			case MIB_IF_TYPE_LOOPBACK:
				type = _T("软件回路接口");
				break;
			case MIB_IF_TYPE_SLIP:
				type = _T("ATM网络接口");
				break;
			}
			info += CString(_T("网卡类型:")) + type + CString(_T("\r\n"));
			pUnicast = pCurrAddresses->FirstUnicastAddress;
			while (pUnicast)//单播IP
			{
				CHAR IP[130] = { 0 };
				if (AF_INET == pUnicast->Address.lpSockaddr->sa_family)// IPV4 地址,使用 IPV4 转换
					inet_ntop(PF_INET, &((sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
				else if (AF_INET6 == pUnicast->Address.lpSockaddr->sa_family)// IPV6 地址,使用 IPV6 转换
					inet_ntop(PF_INET6, &((sockaddr_in6*)pUnicast->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
				info += CString(_T("单播IP:")) + CString(IP) + CString(_T("\r\n"));
				pUnicast = pUnicast->Next;
			}
			pDnServer = pCurrAddresses->FirstDnsServerAddress;
			while (pDnServer)//DNS
			{
				CHAR DNS[130] = { 0 };
				if (AF_INET == pDnServer->Address.lpSockaddr->sa_family)
					inet_ntop(PF_INET, &((sockaddr_in*)pDnServer->Address.lpSockaddr)->sin_addr, DNS, sizeof(DNS));
				else if (AF_INET6 == pDnServer->Address.lpSockaddr->sa_family)
					inet_ntop(PF_INET6, &((sockaddr_in6*)pDnServer->Address.lpSockaddr)->sin6_addr, DNS, sizeof(DNS));
				info += CString(_T("DNS:")) + CString(DNS) + CString(_T("\r\n"));
				pDnServer = pDnServer->Next;
			}
			CString MTU;// MTU 
			MTU.Format(_T("MTU:%d\r\n"), pCurrAddresses->Mtu);
			info += MTU;
			info += CString(_T("\r\n"));
			pCurrAddresses = pCurrAddresses->Next;
		}
	}
	else
	{
		CString s;
		s.Format(_T("fGetAdaptersAddress failed,error code:%d"), GetLastError());
		AfxMessageBox(s);
	}
	if (pAddresses)
		free(pAddresses);
	return true;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种流行的编程语言,可以用来开发Windows操作系统上的应用程序。要获取本机的网卡信息,包括IPv6地址信息,可以使用Delphi提供的一些函数和类。 首先,我们可以使用`TIdStack`类来获取本机所有的IP地址。`TIdStack`是Delphi中用于处理网络与套接字编程的类。可以通过调用`TIdStack.LocalAddress`方法来获取本机的IP地址列表。这个方法返回一个`TIdStackLocalAddressList`对象,其中包含了获取到的IP地址的详细信息,包括IPv6地址信息。 下面是一个示例代码,展示了如何获取本机的网卡信息IPv6地址信息: ```delphi uses IdStack; procedure GetLocalNetworkCardInfo; var Stack: TIdStack; LocalAddressList: TIdStackLocalAddressList; I: Integer; begin Stack := TIdStack.Create; LocalAddressList := TIdStackLocalAddressList.Create; try Stack.GetLocalAddressList(LocalAddressList); for I := 0 to LocalAddressList.Count - 1 do begin // 输出网卡信息 Writeln('网卡名称:', LocalAddressList[I].InterfaceName); Writeln('IPv4地址:', LocalAddressList[I].IPAddress); // 输出IPv6地址信息 if LocalAddressList[I].IPVersion = Id_IPv6 then begin Writeln('IPv6地址:', LocalAddressList[I].IPAddress); Writeln('IPv6标识:', LocalAddressList[I].IP6LocalLink.Address.S6_addr); end; Writeln('-----------------'); end; finally LocalAddressList.Free; Stack.Free; end; end; ``` 在上述代码中,我们首先创建了一个`TIdStack`对象和一个`TIdStackLocalAddressList`对象。然后,调用`GetLocalAddressList`方法来将本机的网卡信息存储到`LocalAddressList`对象中。接下来,我们遍历`LocalAddressList`对象,输出每个网卡的名称和IPv4地址。如果网卡支持IPv6,我们还输出其IPv6地址和IPv6标识。 以上就是使用Delphi获取本机网卡信息(包括IPv6地址信息)的方法。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值