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

本文没有使用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);
}


posted on 2013-04-20 17:45  存在的存在  阅读(629)  评论(0编辑  收藏  举报

导航