Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)

来源:互联网 发布:手机淘宝联盟怎么推广 编辑:程序博客网 时间:2024/05/22 00:27

本文没有使用ioctl 函数,未使用socket ,直接获取本地的所有地址,包括IPv4,IPV6,MAC 地址:

核心函数是:getifaddrs() & freeifaddrs()

代码如下:

#include <stdio.h>#include <sys/socket.h>#include <ifaddrs.h>#include <netpacket/packet.h>#include <arpa/inet.h>/*------------------------------------------------------------------------------ * NAME         : GetInterfaceAddress * DESCRIPTION  :  * PARAMETERS   : 无 * RETURNVALUE  : 无 * ERRORS       : * NOTES        :  *  * AUTHOR       : alex * CREATETIME   : 2013年4月20日, 17:44 * MOTIFYTIME   : *------------------------------------------------------------------------------ */void GetInterfaceAddress(){    struct ifaddrs *ifaddr, *ifa;    int family;    if (getifaddrs(&ifaddr) == -1)    {        perror("getifaddrs");                return;    }    /* 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;        switch (family)        {            case AF_PACKET:            {                printf("%s  address family: %d%s\n", ifa->ifa_name, family, " AF_PACKET");                struct sockaddr_ll *s = (struct sockaddr_ll*) ifa->ifa_addr;                for (int i = 0; i < 6; i++)                {                    printf("%s%02X%s", i == 0 ? "\tMAC Address:<" : "", s->sll_addr[i], i < 5 ? ":" : ">\n");                }                break;            }            case AF_INET:            {                printf("%s  address family: %d%s\n", ifa->ifa_name, family, " AF_INET");                struct sockaddr_in *s = (struct sockaddr_in *) ifa->ifa_addr;                //char * aip = inet_ntoa(s->sin_addr);                char aip[16];                inet_ntop(AF_INET,&s->sin_addr,aip,sizeof(aip));                printf("\tIPv4 Address:<%s>\n", aip);                break;            }            case AF_INET6:            {                printf("%s  address family: %d%s\n", ifa->ifa_name, family, " AF_INET6");                struct sockaddr_in6 *s = (struct sockaddr_in6 *) ifa->ifa_addr;                //char * aip = inet_ntoa(s->sin_addr);                char aip[40];                inet_ntop(AF_INET6,&s->sin6_addr,aip,sizeof(aip));                printf("\tIPv4 Address:<%s>\n", aip);                break;            }            default:            {                printf("Unknown address family\n");                break;            }        }    }    freeifaddrs(ifaddr);}


原创粉丝点击