现在的位置: 首页 > 综合 > 正文

获取本地IP和子网掩码

2013年03月19日 ⁄ 综合 ⁄ 共 990字 ⁄ 字号 评论关闭
#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;
}

抱歉!评论已关闭.