代码片段:获取系统所有IP

代码片段:获取系统所有IP

作者:BlogUpdater |  时间:2017-11-05 |  浏览:3759 |  评论已关闭 条评论

在Windows系统中,可以支持多个网卡,比如有线的以太网卡,无线网卡,虚拟网卡等。如下图所示:

而一个网卡,其IP地址可以是DHCP自动分配,也可以手动设定。在手动设定模式下,还可以添加多个IP地址。如下图所示:

那么,如何通过代码的方式来获取所有的这些IP地址呢?废话少说,直接上代码吧!

bool ShowAllIpAddr()
{
	PIP_ADAPTER_ADDRESSES pAddresses = NULL;
	PIP_ADAPTER_ADDRESSES pAddresses_start = NULL;
	IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
	ULONG outBufLen = 0;
	DWORD dwRetVal = 0;
	char buff[100];
	DWORD bufflen=100;
	int i;

	GetAdaptersAddresses(AF_UNSPEC,0, NULL, pAddresses,&outBufLen);
	pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);
	pAddresses_start = pAddresses;
	if ((dwRetVal = GetAdaptersAddresses(AF_INET,GAA_FLAG_SKIP_ANYCAST,NULL,pAddresses,&outBufLen)) == NO_ERROR)
	{
		while (pAddresses != NULL)
		{
			if (pAddresses->OperStatus == IfOperStatusUp && (pAddresses->IfType != IF_TYPE_SOFTWARE_LOOPBACK))
			{
				PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pAddresses->FirstUnicastAddress;
				for (i = 0; pUnicast != NULL; i++)
				{
					if (pUnicast->Address.lpSockaddr->sa_family == AF_INET)
					{
						sockaddr_in *sa_in = (sockaddr_in *)pUnicast->Address.lpSockaddr;
						// Dealing with ip address in structure sa_in
					}
					pUnicast = pUnicast->Next;
				}
			}

			pAddresses = pAddresses->Next;
		}
	}
	else
	{
	    // Error handling
	    return false;
	}
	free(pAddresses_start);

	return true;
}

代码解析:
以上代码结构简单,首先调用GetAdaptersAddresses获取系统所有网卡,然后循环每个网卡。对于每个网卡,通过FirstUnicastAddress成员获取该网卡的起始IP,然后循环获取该网卡的所有IP。注意,这里仅获取已启用网卡的IP地址列表并过滤掉了本地回环地址。

标签:

评论已关闭。