Main Page Modules Data Structures File List Data Fields Globals Related Pages

# Obtaining advanced information about installed devices
[WinPcap tutorial: a step by step guide to program WinPcap]

Lesson 1 (Obtaining the device list ) showed how to get basic information (i.e. device name and description) about available adapters. Actually, WinPcap provides also other advanced information. In particular, every pcap_if structure returned by pcap_findalldevs() contains also a list of pcap_addr structures, with:

- a list of addresses for that interface.
- a list of netmasks (each of which corresponds to an entry in the addresses list).
- a list of broadcast addresses (each of which corresponds to an entry in the addresses list).
- a list of destination addresses (each of which corresponds to an entry in the addresses list).

The following sample provides an ifprint() function that prints the whole content of a pcap_if structure. It is invoked by the program for every entry returned by pcap_findalldevs().

    /*
     * Copyright (c) 1999 - 2002
     *  Politecnico di Torino.  All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that: (1) source code distributions
     * retain the above copyright notice and this paragraph in its entirety, (2)
     * distributions including binary code include the above copyright notice and
     * this paragraph in its entirety in the documentation or other materials
     * provided with the distribution, and (3) all advertising materials mentioning
     * features or use of this software display the following acknowledgement:
     * ``This product includes software developed by the Politecnico
     * di Torino, and its contributors.'' Neither the name of
     * the University nor the names of its contributors may be used to endorse
     * or promote products derived from this software without specific prior
     * written permission.
     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     */

    #include "pcap.h"
    #ifndef WIN32
    #include <sys/socket.h>
    #include <netinet/in.h>
    #else
    #include <winsock.h>
    #endif

    void ifprint(pcap_if_t *d);
    char *iptos(u_long in);

    int main()
    {
      pcap_if_t *alldevs;
      pcap_if_t *d;
      char errbuf[PCAP_ERRBUF_SIZE+1];

      /* Retrieve the interfaces list */
      if (pcap_findalldevs(&alldevs, errbuf) == -1)
      {
        fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
        exit(1);
      }

      /* Scan the list printing every entry */
      for(d=alldevs;d;d=d->next)
      {
        ifprint(d);
      }

      return 1;
    }

    /* Print all the available information on the given interface */
    void ifprint(pcap_if_t *d)
    {
      pcap_addr_t *a;

      /* Name */
      printf("%s\n",d->name);

      /* Description */
      if (d->description)
        printf("\tDescription: %s\n",d->description);

      /* Loopback Address*/
      printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

      /* IP addresses */
      for(a=d->addresses;a;a=a->next) {
        printf("\tAddress Family: #%d\n",a->addr->sa_family);

        switch(a->addr->sa_family)
        {
          case AF_INET:
            printf("\tAddress Family Name: AF_INET\n");
            if (a->addr)
              printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
            if (a->netmask)
              printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
            if (a->broadaddr)
              printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
            if (a->dstaddr)
              printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
            break;
          default:
            printf("\tAddress Family Name: Unknown\n");
            break;
        }
      }
      printf("\n");
    }

    /* From tcptraceroute, convert a numeric IP address to a string */
    #define IPTOSBUFFERS    12
    char *iptos(u_long in)
    {
        static char output[IPTOSBUFFERS][3*4+3+1];
        static short which;
        u_char *p;

        p = (u_char *)&in;
        which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
        sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
        return output[which];
    }

documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.