Search code examples
clinuxsockets

Get IP address of an interface on Linux


How can I get the IPv4 address of an interface on Linux from C code?

For example, I'd like to get the IP address (if any) assigned to eth0.


Solution

  • Try this:

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h> /* for strncpy */
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <netinet/in.h>
    #include <net/if.h>
    #include <arpa/inet.h>
    
    int
    main()
    {
     int fd;
     struct ifreq ifr;
    
     fd = socket(AF_INET, SOCK_DGRAM, 0);
    
     /* I want to get an IPv4 IP address */
     ifr.ifr_addr.sa_family = AF_INET;
    
     /* I want IP address attached to "eth0" */
     strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
    
     ioctl(fd, SIOCGIFADDR, &ifr);
    
     close(fd);
    
     /* display result */
     printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
    
     return 0;
    }
    

    The code sample is taken from here.