windows 获得IP地址

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <WS2tcpip.h>

using namespace std;

// Link with Iphlpapi.lib
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "Ws2_32.lib")

#define WORKING_BUFFER_SIZE 15000

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

static vector<string> getIPv4Addr()
{
	/* IPv4 address vector */
	vector<string> vStrIP;

	/* Declare and initialize variables */
	DWORD dwRetVal = 0;

	// Set the flags to pass to GetAdaptersAddresses
	ULONG flags = GAA_FLAG_INCLUDE_PREFIX;

	// IPv4 address family
	ULONG family = AF_INET;

	LPVOID lpMsgBuf = NULL;

	PIP_ADAPTER_ADDRESSES pAddresses = NULL;
	ULONG outBufLen = 0;
	ULONG Iterations = 0;

	PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
	PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;

	// Allocate a 15 KB buffer to start with.
	outBufLen = WORKING_BUFFER_SIZE;

	do {
		pAddresses = (IP_ADAPTER_ADDRESSES *)MALLOC(outBufLen);
		if (pAddresses == NULL) {
			cout << "Memory allocation failed for IP_ADAPTER_ADDRESSES struct" << endl;
			return vStrIP;
		}

		dwRetVal =
			GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

		if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
			FREE(pAddresses);
			pAddresses = NULL;
		}
		else {
			break;
		}
	} while (dwRetVal == ERROR_BUFFER_OVERFLOW);

	if (dwRetVal == NO_ERROR) {
		pCurrAddresses = pAddresses;
		while (pCurrAddresses) {
			if (pCurrAddresses->IfType == MIB_IF_TYPE_ETHERNET) //ethernet interface
			{
				CHAR IP[130] = { 0 };
				pUnicast = pCurrAddresses->FirstUnicastAddress;
				inet_ntop(PF_INET, &((sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
				vStrIP.push_back(IP);
			}
			pCurrAddresses = pCurrAddresses->Next;
		}
	}

	if (pAddresses) {
		FREE(pAddresses);
	}

	return vStrIP;
}

int __cdecl main(int argc, char **argv)
{

	/* Declare and initialize variables */
	DWORD dwRetVal = 0;

	// Set the flags to pass to GetAdaptersAddresses
	ULONG flags = GAA_FLAG_INCLUDE_PREFIX;

	// IPv4 address family
	ULONG family = AF_INET;

	LPVOID lpMsgBuf = NULL;

	PIP_ADAPTER_ADDRESSES pAddresses = NULL;
	ULONG outBufLen = 0;
	ULONG Iterations = 0;

	PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
	PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;

	// Allocate a 15 KB buffer to start with.
	outBufLen = WORKING_BUFFER_SIZE;

	do {

		pAddresses = (IP_ADAPTER_ADDRESSES *)MALLOC(outBufLen);
		if (pAddresses == NULL) {
			printf
				("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
			exit(1);
		}

		dwRetVal =
			GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

		if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
			FREE(pAddresses);
			pAddresses = NULL;
		}
		else {
			break;
		}
	} while (dwRetVal == ERROR_BUFFER_OVERFLOW);

	if (dwRetVal == NO_ERROR) {
		// If successful, output some information from the data we received
		pCurrAddresses = pAddresses;
		while (pCurrAddresses) {
			if (pCurrAddresses->PhysicalAddressLength != 0)
			{
				printf("\tAdapter Mac: %02X%02X%02X%02X%02X%02X\n", 
					pCurrAddresses->PhysicalAddress[0], pCurrAddresses->PhysicalAddress[1],
					pCurrAddresses->PhysicalAddress[2], pCurrAddresses->PhysicalAddress[3], 
					pCurrAddresses->PhysicalAddress[4], pCurrAddresses->PhysicalAddress[5]);
			}

			char type[64];
			switch (pCurrAddresses->IfType)
			{
			case MIB_IF_TYPE_ETHERNET:
				sprintf_s(type, "以太网接口");
				break;
			case MIB_IF_TYPE_PPP:
				sprintf_s(type, "PPP接口");
				break;
			case MIB_IF_TYPE_LOOPBACK:
				sprintf_s(type, "软件回路接口");
				break;
			case MIB_IF_TYPE_SLIP:
				sprintf_s(type, "ATM网络接口");
				break;
			case IF_TYPE_IEEE80211:
				sprintf_s(type, "无线网络接口");
				break;
			default:
				break;
			}
			printf("\t网卡类型: %s\n", type);

			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));
					printf("\tIPv4: %s\n", 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));
					printf("\tIPv6: %s\n", IP);
				}
				pUnicast = pUnicast->Next;
			}

			printf("\tMtu: %lu\n", pCurrAddresses->Mtu);

			printf("\n");

			pCurrAddresses = pCurrAddresses->Next;
		}
	}
	else {
		printf("Call to GetAdaptersAddresses failed with error: %d\n",
			dwRetVal);
		if (dwRetVal == ERROR_NO_DATA)
			printf("\tNo addresses were found for the requested parameters\n");
		else {

			if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				// Default language
				(LPTSTR)& lpMsgBuf, 0, NULL)) {
				printf("\tError: %s", lpMsgBuf);
				LocalFree(lpMsgBuf);
				if (pAddresses)
					FREE(pAddresses);
				exit(1);
			}
		}
	}

	if (pAddresses) {
		FREE(pAddresses);
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值