获取本地IP和子网掩码

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdlib.h>

#include <string>

#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "IPHLPAPI.lib")

std::string GetMaskFromIp(const std::string &ip)
{
	std::string ret;
	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter = NULL;

	ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
	pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof (IP_ADAPTER_INFO));
	
	if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen))
	{
		free(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *) malloc(ulOutBufLen);
	}

	if (NO_ERROR == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen))
	{
		pAdapter = pAdapterInfo;
		while (pAdapter)
		{
			if (ip == pAdapter->IpAddressList.IpAddress.String)
			{
				ret = pAdapter->IpAddressList.IpMask.String;
				break;
			} // 在这里循环可以获取所有网卡信息
			pAdapter = pAdapter->Next;
		}
	}

	if (pAdapterInfo)
	{
		free(pAdapterInfo);
	}
	return ret;
}

std::string GetLocalIp(SOCKET sock)
{
	std::string ret;
	sockaddr_in localAddr;
	int addrLen = sizeof(localAddr);
	if (0 == getsockname(sock, (sockaddr*)&localAddr, &addrLen))
	{
		ret = inet_ntoa(localAddr.sin_addr);
	}
	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值