Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux下获取本地IP地址--------getifaddrs

今天在看sheepdog的时候发现了getifaddrs()这个接口,它可以查找到系统所有的网络接口的信息,包括以太网卡接口和回环接口等。利用这个接口来获取本机的IP地址真是太方便了,原来的getaddrinfo()、ioctl()或者利用套接字方法等来获取IP地址的方法都没法跟这个接口比,不仅方便,而且也非常的强大,完全不需要绑定主机名等类似的操作。看了一下glibc的源码,它是利用netlink来实现的,所以在使用这个接口的时候一定要确保你的内核支持netlink。下面是man手册中的一个例子:#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.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);
    }    /* Walk through linked list, maintaining head pointer so we
   *             can free list later */    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL)
            continue;        family = ifa->ifa_addr->sa_family;        /* Display interface name and family (including symbolic
       *                 form of the latter for the common families) */        printf("%s  address family: %d%s ",
                ifa->ifa_name, family,
                (family == AF_PACKET) ? " (AF_PACKET)" :
                (family == AF_INET) ? " (AF_INET)" :
                (family == AF_INET6) ?  " (AF_INET6)" : "");        /* For an AF_INET* interface address, display the address */        if (family == AF_INET || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                    (family == AF_INET) ? sizeof(struct sockaddr_in) :
                    sizeof(struct sockaddr_in6),
                    host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s ", gai_strerror(s));
                exit(EXIT_FAILURE);
            }
            printf(" address: <%s> ", host);
        }
    }    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}