Created
February 6, 2020 20:32
-
-
Save mwiegant/25012fff3105116214ca69394d9fb82b to your computer and use it in GitHub Desktop.
C++, windows, get the information on all network interfaces
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <winsock2.h> | |
#include <iphlpapi.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <WS2tcpip.h> | |
// Link with Iphlpapi.lib | |
#pragma comment(lib, "IPHLPAPI.lib") | |
//////////////// all the code below should sit in a function, and could all be copy / pasted together into one | |
/* Declare and initialize variables */ | |
DWORD dwSize = 0; | |
DWORD dwRetVal = 0; | |
unsigned int i = 0; | |
// only get IPv4 addresses | |
ULONG flags = 0; // GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; | |
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; | |
PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL; | |
PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL; | |
IP_ADAPTER_DNS_SERVER_ADDRESS* pDnServer = NULL; | |
IP_ADAPTER_PREFIX* pPrefix = NULL; | |
// for printing IPv4 addresses | |
char buff[100]; | |
DWORD bufflen = 100; | |
// allow the buffer to determine what length it needs to be ... | |
dwRetVal = GetAdaptersAddresses(family, flags, NULL, NULL, &outBufLen); | |
if (dwRetVal != ERROR_BUFFER_OVERFLOW) | |
{ | |
Logger->Error("Failed to get length of the AdapterAddresses. Cannot retrieve IPv4 address. Err code: " + to_string(dwRetVal)); | |
} | |
pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen); | |
// ... and then get the adapter addresses | |
dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen); | |
if (dwRetVal == NO_ERROR) { | |
// If successful, output some information from the data we received | |
pCurrAddresses = pAddresses; | |
while (pCurrAddresses) { | |
printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n", | |
pCurrAddresses->Length); | |
printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex); | |
printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName); | |
pUnicast = pCurrAddresses->FirstUnicastAddress; | |
if (pUnicast != NULL) { | |
for (i = 0; pUnicast != NULL; i++) | |
{ | |
sockaddr_in* sa_in = (sockaddr_in*)pUnicast->Address.lpSockaddr; | |
printf("\tIPV4: %s\n", inet_ntop(AF_INET, &(sa_in->sin_addr), buff, bufflen)); | |
pUnicast = pUnicast->Next; | |
} | |
//printf("\tNumber of Unicast Addresses: %d\n", i); | |
} | |
else | |
printf("\tNo Unicast Addresses\n"); | |
pAnycast = pCurrAddresses->FirstAnycastAddress; | |
if (pAnycast) { | |
/*for (i = 0; pAnycast != NULL; i++) | |
pAnycast = pAnycast->Next;*/ | |
for (i = 0; pAnycast != NULL; i++) | |
{ | |
sockaddr_in* sa_in = (sockaddr_in*)pAnycast->Address.lpSockaddr; | |
printf("\tAnycast: %s\n", inet_ntop(AF_INET, &(sa_in->sin_addr), buff, bufflen)); | |
pAnycast = pAnycast->Next; | |
} | |
//printf("\tNumber of Anycast Addresses: %d\n", i); | |
} | |
else | |
printf("\tNo Anycast Addresses\n"); | |
pMulticast = pCurrAddresses->FirstMulticastAddress; | |
if (pMulticast) { | |
/*for (i = 0; pMulticast != NULL; i++) | |
pMulticast = pMulticast->Next;*/ | |
for (i = 0; pMulticast != NULL; i++) | |
{ | |
sockaddr_in* sa_in = (sockaddr_in*)pMulticast->Address.lpSockaddr; | |
printf("\tmulticast: %s\n", inet_ntop(AF_INET, &(sa_in->sin_addr), buff, bufflen)); | |
pMulticast = pMulticast->Next; | |
} | |
//printf("\tNumber of Multicast Addresses: %d\n", i); | |
} | |
else | |
printf("\tNo Multicast Addresses\n"); | |
pDnServer = pCurrAddresses->FirstDnsServerAddress; | |
if (pDnServer) { | |
/*for (i = 0; pDnServer != NULL; i++) | |
pDnServer = pDnServer->Next;*/ | |
for (i = 0; pDnServer != NULL; i++) | |
{ | |
sockaddr_in* sa_in = (sockaddr_in*)pDnServer->Address.lpSockaddr; | |
printf("\tDNS server: %s\n", inet_ntop(AF_INET, &(sa_in->sin_addr), buff, bufflen)); | |
pDnServer = pDnServer->Next; | |
} | |
//printf("\tNumber of DNS Server Addresses: %d\n", i); | |
} | |
else | |
printf("\tNo DNS Server Addresses\n"); | |
printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix); | |
printf("\tDescription: %wS\n", pCurrAddresses->Description); | |
printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName); | |
if (pCurrAddresses->PhysicalAddressLength != 0) { | |
printf("\tPhysical address: "); | |
for (i = 0; i < (int)pCurrAddresses->PhysicalAddressLength; | |
i++) { | |
if (i == (pCurrAddresses->PhysicalAddressLength - 1)) | |
printf("%.2X\n", | |
(int)pCurrAddresses->PhysicalAddress[i]); | |
else | |
printf("%.2X-", | |
(int)pCurrAddresses->PhysicalAddress[i]); | |
} | |
} | |
printf("\tFlags: %ld\n", pCurrAddresses->Flags); | |
printf("\tMtu: %lu\n", pCurrAddresses->Mtu); | |
printf("\tIfType: %ld\n", pCurrAddresses->IfType); | |
printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus); | |
printf("\tIpv6IfIndex (IPv6 interface): %u\n", | |
pCurrAddresses->Ipv6IfIndex); | |
printf("\tZoneIndices (hex): "); | |
for (i = 0; i < 16; i++) | |
printf("%lx ", pCurrAddresses->ZoneIndices[i]); | |
printf("\n"); | |
printf("\tTransmit link speed: %I64u\n", pCurrAddresses->TransmitLinkSpeed); | |
printf("\tReceive link speed: %I64u\n", pCurrAddresses->ReceiveLinkSpeed); | |
pPrefix = pCurrAddresses->FirstPrefix; | |
if (pPrefix) { | |
for (i = 0; pPrefix != NULL; i++) | |
pPrefix = pPrefix->Next; | |
printf("\tNumber of IP Adapter Prefix entries: %d\n", i); | |
} | |
else | |
printf("\tNumber of IP Adapter Prefix entries: 0\n"); | |
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); | |
} | |
} | |
} | |
if (pAddresses) { | |
free(pAddresses); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment