Share Pastebin
Guest
Public paste!

Sockets

By: a guest | Mar 20th, 2010 | Syntax: C | Size: 2.29 KB | Hits: 119 | Expires: Never
Copy text to clipboard
  1.  
  2.        #include <arpa/inet.h>
  3.        #include <sys/socket.h>
  4.        #include <netdb.h>
  5.        #include <ifaddrs.h>
  6.        #include <stdio.h>
  7.        #include <stdlib.h>
  8.        #include <stddef.h>
  9.        #include <unistd.h>
  10.  
  11.        int
  12.        main(int argc, char *argv[])
  13.        {
  14.            struct ifaddrs *ifaddr, *ifa;
  15.            int family, s;
  16.            char host[NI_MAXHOST];
  17.  
  18.            int i; /* Added */
  19.  
  20.            if (getifaddrs(&ifaddr) == -1) {
  21.                perror("getifaddrs");
  22.                exit(EXIT_FAILURE);
  23.            }
  24.  
  25.            /* Walk through linked list, maintaining head pointer so we
  26.               can free list later */
  27.  
  28.            for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
  29.                family = ifa->ifa_addr->sa_family;
  30.  
  31.                /* Display interface name and family (including symbolic
  32.                   form of the latter for the common families) */
  33.  
  34.                printf("%s  address family: %d%s\n",
  35.                        ifa->ifa_name, family,
  36.                        (family == AF_INET) ?   " (AF_INET)" :
  37.                        (family == AF_INET6) ?  " (AF_INET6)" : "");
  38.  
  39.                /* Added */
  40.                for (i = 0; i < 15; i++) printf("%d ", ((unsigned char *)ifa->ifa_addr)[i]);
  41.                printf("\n");
  42.  
  43.                /* >>>>>>>>> this returns 1 for size and 1 for offset <<<<<<<< */
  44.                printf("size %ld offset %ld\n",
  45.                       sizeof(ifa->ifa_addr->sa_family),
  46.                       offsetof(struct sockaddr, sa_family));
  47.  
  48.                /* For an AF_INET* interface address, display the address */
  49.  
  50.                if (family == AF_INET || family == AF_INET6) {
  51.                    s = getnameinfo(ifa->ifa_addr,
  52.                            (family == AF_INET) ? sizeof(struct sockaddr_in) :
  53.                                                  sizeof(struct sockaddr_in6),
  54.                            host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
  55.                    if (s != 0) {
  56.                        printf("getnameinfo() failed: %s\n", gai_strerror(s));
  57.                        exit(EXIT_FAILURE);
  58.                    }
  59.                    printf("\taddress: <%s>\n", host);
  60.                }
  61.            }
  62.  
  63.            freeifaddrs(ifaddr);
  64.            exit(EXIT_SUCCESS);
  65.        }