< GetAdaptersInfo & GetAdaptersAddresses Examples | IP Helper Functions Main | Interface Table & SetIpForwardEntry Examples >


 

 

IP Helper Functions 13 Part 10

 

 

What do we have in this chapter 13 part 10?

  1. Program Example Using GetInterfaceInfo() Function

  2. Program Example Using GetIfEntry() and GetIfTable() Functions

 

Program Example Using GetInterfaceInfo() Function

 

The GetInterfaceInfo() function obtains the list of the network interface adapters with IPv4 enabled on the local system. Create a new empty Win32 console mode application and add the project/solution name.

 

IP Helper Functions: Program Example Using GetInterfaceInfo() Function

 

Add the following code.

 

// Description:

//          The following example retrieves the list of network adapters

//          with IPv4 enabled on the local system and prints various

//          properties of the first network adapter

//

// Link to ws2_32.lib

#include <winsock2.h>

#include <ws2ipdef.h>

// Link to Iphlpapi.lib

#include <iphlpapi.h>

#include <stdio.h>

 

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

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

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

 

int main(int argc, char **argv)

{

    // Declare and initialize variables

    PIP_INTERFACE_INFO pInfo;

    ULONG ulOutBufLen = 0;

    DWORD dwRetVal = 0;

    int iReturn = 1, i;

 

    // Make an initial call to GetInterfaceInfo to get

    // the necessary size in the ulOutBufLen variable

    dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);

    if (dwRetVal == ERROR_INSUFFICIENT_BUFFER)

    {

        printf("Not enough buffer! Re-allocating...\n");

        pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen);

        if (pInfo == NULL)

        {

            printf("Unable to allocate memory needed to call GetInterfaceInfo()!\n");

            return 1;

        }

        else

            printf("Memory needed to call GetInterfaceInfo() has been allocated!\n");

    }

    else

        printf("GetInterfaceInfo() should be fine!\n");

 

    // Make a second call to GetInterfaceInfo to get

    // the actual data we need

    dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);

    if (dwRetVal == NO_ERROR)

    {

        printf("GetInterfaceInfo() is OK!\n");

        printf("Number of Adapters: %ld\n\n", pInfo->NumAdapters);

        for (i = 0; i < (int) pInfo->NumAdapters; i++)

        {

            printf("Adapter Index[%d]: %ld\n", i, pInfo->Adapter[i].Index);

            printf("Adapter Name[%d]: %ws\n\n", i, pInfo->Adapter[i].Name);

        }

        iReturn = 0;

    }

    else if (dwRetVal == ERROR_NO_DATA)

    {

        printf("There are no network adapters with IPv4 enabled on the local system!\n");

        iReturn = 0;

    }

    else

    {

        printf("GetInterfaceInfo() failed with error code %d\n", dwRetVal);

        iReturn = 1;

    }

    FREE(pInfo);

    return (iReturn);

}

 

Build and run the project.

 

IP Helper Functions: Program Example Using GetInterfaceInfo() Function sample output in action

 

Program Example Using GetIfEntry() and GetIfTable() Functions

 

The GetIfEntry() function retrieves information for the specified interface on the local computer. The GetIfTable() function retrieves the MIB-II interface table. Create a new empty Win32 console mode application and add the project/solution name.

 

IP Helper Functions: Program Example Using GetIfEntry() and GetIfTable() Functions

 

Add the following source code.

 

// Description:

//          The following example retrieves the entries from the interface

//          table and prints some of the information available for that entry

//

// Link to ws2_32.lib

#include <winsock2.h>

#include <ws2tcpip.h>

// Link to Iphlpapi.lib

#include <iphlpapi.h>

#include <stdio.h>

#include <stdlib.h>

 

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

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

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

 

int main()

{

    // Declare and initialize variables

    DWORD dwSize = 0;

    DWORD dwRetVal = 0;

    int i, j;

    // variables used for GetIfTable and GetIfEntry

    MIB_IFTABLE *pIfTable;

    MIB_IFROW *pIfRow;

 

    // Allocate memory for our pointers.

    pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));

    if (pIfTable == NULL)

    {

        printf("Error allocating memory needed to call GetIfTable()!\n");

        exit (1);

    }

    else

        printf("Memory needed to call GetIfTable() has been allocated!\n");

 

    // Before calling GetIfEntry, we call GetIfTable to make

    // sure there are entries to get and retrieve the interface index.

 

    // Make an initial call to GetIfTable to get the necessary size into dwSize

    dwSize = sizeof (MIB_IFTABLE);

    if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)

    {

        printf("Not enough memory! Re-allocating...\n");

        FREE(pIfTable);

        pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);

        if (pIfTable == NULL)

        {

            printf("Error allocating memory!\n");

            exit (1);

        }

        else

             printf("(Dummy) Memory allocated successfully!\n");

    }

    else

         printf("GetIfTable() should be fine!\n");

 

    // Make a second call to GetIfTable to get the actual data we want.

    if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR)

    {

        if (pIfTable->dwNumEntries > 0)

        {

            pIfRow = (MIB_IFROW *) MALLOC(sizeof (MIB_IFROW));

            if (pIfRow == NULL)

            {

                printf("Error allocating memory!\n");

                if (pIfTable != NULL)

                {

                    FREE(pIfTable);

                    pIfTable = NULL;

                }

                exit (1);

            }

            else

                 printf("Memory allocated successfully for 2nd call!\n");

 

            printf("\n\tNumber of entries: %ld\n\n", pIfTable->dwNumEntries);

            for (i = 0; i < (int) pIfTable->dwNumEntries; i++)

            {

                pIfRow->dwIndex = pIfTable->table[i].dwIndex;

                if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR)

                {

                    printf("\tIndex:\t %ld\n", pIfRow->dwIndex);

                    printf("\tInterfaceName[%d]:\t ", i);

                    if (pIfRow->wszName != NULL)

                        printf("%ws", pIfRow->wszName);

                    printf("\n");

 

                    printf("\tDescription[%d]:\t ", i);

                    for (j = 0; j < (int) pIfRow->dwDescrLen; j++)

                        printf("%c", pIfRow->bDescr[j]);

                    printf("\n");

 

                    printf("\tType[%d]:\t ", i);

                    switch (pIfRow->dwType)

                    {

                    case IF_TYPE_OTHER:

                        printf("Other\n");

                        break;

                    case IF_TYPE_ETHERNET_CSMACD:

                        printf("Ethernet\n");

                        break;

                    case IF_TYPE_ISO88025_TOKENRING:

                        printf("Token Ring\n");

                        break;

                    case IF_TYPE_PPP:

                        printf("PPP\n");

                        break;

                    case IF_TYPE_SOFTWARE_LOOPBACK:

                        printf("Software Lookback\n");

                        break;

                    case IF_TYPE_ATM:

                        printf("ATM\n");

                        break;

                    case IF_TYPE_IEEE80211:

                        printf("IEEE 802.11 Wireless\n");

                        break;

                    case IF_TYPE_TUNNEL:

                        printf("Tunnel type encapsulation\n");

                        break;

                    case IF_TYPE_IEEE1394:

                        printf("IEEE 1394 Firewire\n");

                        break;

                    default:

                        printf("Unknown type %ld\n", pIfRow->dwType);

                        break;

                    }

                    printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);

                    printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);

 

                    printf("\tPhysical Addr:\t ");

                    if (pIfRow->dwPhysAddrLen == 0)

                        printf("\n");

                    for (j = 0; j < (int) pIfRow->dwPhysAddrLen; j++)

                    {

                        if (j == (pIfRow->dwPhysAddrLen - 1))

                            printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);

                        else

                            printf("%.2X-", (int) pIfRow->bPhysAddr[j]);

                    }

 

                    printf("\tAdmin Status[%d]:\t %ld\n", i, pIfRow->dwAdminStatus);

                    printf("\tOper Status[%d]:\t ", i);

 

                    switch (pIfRow->dwOperStatus)

                    {

                    case IF_OPER_STATUS_NON_OPERATIONAL:

                        printf("Non Operational\n");

                        break;

                    case IF_OPER_STATUS_UNREACHABLE:

                        printf("Unreasonable\n");

                        break;

                    case IF_OPER_STATUS_DISCONNECTED:

                        printf("Disconnected\n");

                        break;

                    case IF_OPER_STATUS_CONNECTING:

                        printf("Connecting\n");

                        break;

                    case IF_OPER_STATUS_CONNECTED:

                        printf("Connected\n");

                        break;

                    case IF_OPER_STATUS_OPERATIONAL:

                        printf("Operational\n");

                        break;

                    default:

                        printf("Unknown status %ld\n", pIfRow->dwAdminStatus);

                        break;

                    }

                    printf("\n");

                }

                else {

                    printf("GetIfEntry failed for index %d with error: %ld\n", i, dwRetVal);

                    // Here you can use FormatMessage to find out why it failed

                }

            }

        } else {

                       printf("\tGetIfTable failed with error: %ld\n", dwRetVal);

                   }

 }   

    exit (0);

}

 

Build and run the project.

 

-----------------------------------------------

IP Helper Functions: Program Example Using GetIfEntry() and GetIfTable() Functions sample output in action

 

 

 


< GetAdaptersInfo & GetAdaptersAddresses Examples | IP Helper Functions Main | Interface Table & SetIpForwardEntry Examples >