Get IP address of an interface on Linux Get IP address of an interface on Linux linux linux

Get IP address of an interface on Linux


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>intmain(){ 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.


In addition to the ioctl() method Filip demonstrated you can use getifaddrs(). There is an example program at the bottom of the man page.


If you're looking for an address (IPv4) of the specific interface say wlan0 thentry this code which uses getifaddrs():

#include <arpa/inet.h>#include <sys/socket.h>#include <netdb.h>#include <ifaddrs.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>int main(int argc, char *argv[]){    struct ifaddrs *ifaddr, *ifa;    int family, s;    char host[NI_MAXHOST];    if (getifaddrs(&ifaddr) == -1)     {        perror("getifaddrs");        exit(EXIT_FAILURE);    }    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)     {        if (ifa->ifa_addr == NULL)            continue;          s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);        if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET))        {            if (s != 0)            {                printf("getnameinfo() failed: %s\n", gai_strerror(s));                exit(EXIT_FAILURE);            }            printf("\tInterface : <%s>\n",ifa->ifa_name );            printf("\t  Address : <%s>\n", host);         }    }    freeifaddrs(ifaddr);    exit(EXIT_SUCCESS);}

You can replace wlan0 with eth0 for ethernet and lo for local loopback.

The structure and detailed explanations of the data structuresused could be found here.

To know more about linked list in C this page will be a good starting point.