windows 获取本地机器所有的IP地址

使用套接字获取本地机器的主机名字与IP地址:

 

#include <string>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

bool get_inside_ip(std::string &szHostName, std::string &szIpAddr)
{
	WSADATA wsa;
	WSAStartup(MAKEWORD(2, 2), &wsa);
	SOCKET skt = socket(2, 1, 0);

	//获得主机名
	char HostName[128];	
	if(gethostname(HostName, 128) != 0)
	{
		return false;
	}
	szHostName = std::string(HostName);

	// 获得主机ip地址
	struct hostent * pHost = gethostbyname(HostName);		
	for(int j = 0; j<4; j++ )
	{
		char buf[128];
		if(j > 0)
			szIpAddr += ".";
		sprintf_s(buf, "%u", (unsigned int)((unsigned char*)pHost->h_addr_list[0])[j]);
		szIpAddr.append(std::string(buf));
	}
	closesocket(skt);
	WSACleanup();

	return true;
}

 

 

测试代码:

 

int main()
{
	std::string szHostName, szIpAddr;
	bool bOkey = get_inside_ip(szHostName, szIpAddr);

	printf("name : %s, ip : %s\n", szHostName.c_str(), szIpAddr.c_str());

	system("pause");

	return 0;
}

 

但是,这种方法存在一个问题:就是只能获取一个网卡的ip地址,而且当你的机器上装有以太网卡和无线网卡,它优先获取的是无线网卡的地址。话不多说,下面贴出的是,获取机器上面所有网卡的IP地址:

 

#include <Windows.h>
#include <Iphlpapi.h>
#include <vector>
#include <string>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库

std::vector<std::string> GetLocalAddress()
{
	std::vector<std::string> vecAddrs;
	vecAddrs.clear();

	std::string strAddress;

	//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
	PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();

	//得到结构体大小,用于GetAdaptersInfo参数
	unsigned long stSize = sizeof(IP_ADAPTER_INFO);

	//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;
	//其中stSize参数既是一个输入量也是一个输出量
	int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);

	//如果函数返回的是ERROR_BUFFER_OVERFLOW,
	//则说明GetAdaptersInfo参数传递的内存空间不够
	//同时其传出stSize,表示需要的空间大小
	if (ERROR_BUFFER_OVERFLOW == nRel)
	{
		//释放原来的内存空间
		delete pIpAdapterInfo;

		//重新申请内存空间用来存储所有网卡信息
		pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];

		//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
		nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
	}

	if (ERROR_SUCCESS == nRel)
	{
		//输出网卡信息//可能有多网卡,因此通过循环去判断		
		while (pIpAdapterInfo)
		{
			//可能网卡有多IP,因此通过循环去判断
			IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
			switch(pIpAdapterInfo->Type)
			{
			case MIB_IF_TYPE_OTHER:
			case MIB_IF_TYPE_ETHERNET:
			case MIB_IF_TYPE_TOKENRING:
			case MIB_IF_TYPE_FDDI:
			case MIB_IF_TYPE_PPP:
			case MIB_IF_TYPE_LOOPBACK:
			case MIB_IF_TYPE_SLIP:
				{
					strAddress = pIpAddrString->IpAddress.String;
					//有时可能获取的IP地址是0.0.0.0,需要过滤掉
					if(std::string("0.0.0.0") == strAddress)
						break;
					vecAddrs.push_back(strAddress); 
					break;
				}
			default:
				//未知类型网卡就跳出
				break;
			}
			pIpAdapterInfo = pIpAdapterInfo->Next;
		}
	}
	//释放内存空间
	if (pIpAdapterInfo)
	{
		delete pIpAdapterInfo;
		pIpAdapterInfo = NULL;
	}
	return vecAddrs;
}


int main()
{
	std::vector<std::string> data = GetLocalAddress();
	std::vector<std::string> ::iterator itr = data.begin();
	for (itr; itr!=data.end(); ++itr)
	{
		std::cout << (*itr).c_str() << "\r\n" << std::endl;
	}

	system("pause");

	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hellokandy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值