Skip to content

Instantly share code, notes, and snippets.

@mwiegant
Created February 6, 2020 20:32
Show Gist options
  • Save mwiegant/25012fff3105116214ca69394d9fb82b to your computer and use it in GitHub Desktop.
Save mwiegant/25012fff3105116214ca69394d9fb82b to your computer and use it in GitHub Desktop.
C++, windows, get the information on all network interfaces
#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