Linxu的struct ifaddrs 与getifaddrs()函数

来源:互联网 发布:花生壳 ddns 域名管理 编辑:程序博客网 时间:2024/05/25 01:35

来自man函数手册中的介绍:

1,关于struct ifaddrs的说明:

struct ifaddrs{    struct ifaddrs  *ifa_next;    /* Next item in list */    char            *ifa_name;    /* Name of interface */    unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */    struct sockaddr *ifa_addr;    /* Address of interface */    struct sockaddr *ifa_netmask; /* Netmask of interface */    union    {        struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */        struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */    } ifa_ifu;    #define              ifa_broadaddr ifa_ifu.ifu_broadaddr    #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr    void            *ifa_data;    /* Address-specific data */}; 

2,关于getifaddrs()


The getifaddrs() function creates a linked list of structures describing the network interfaces of the local system, and stores the address of the first
item of the list in *ifap. 
The list consists of ifaddrs structures, defined as follows:

       The ifa_next field contains a pointer to the next structure on the list, or
       NULL if this is the last item of the list.

       The ifa_name points to the null-terminated interface name.

       The ifa_flags field contains the interface flags

       The ifa_addr field points to a structure containing the interface address.

       The ifa_netmask field points to a structure containing the netmask associated with ifa_addr, if applicable for the address family.

       Depending on whether the bit IFF_BROADCAST or IFF_POINTOPOINT is set in ifa_flags (only one can be set at a time), either ifa_broadaddr will contain the broadcast address associated with ifa_addr (if applicable for the address family) or ifa_dstaddr will contain the destination address of the point-to-point interface.

       The ifa_data field points to a buffer containing address-family-specific data;this field may be NULL if there is no such data for this interface.

返回值:
On success, getifaddrs() returns zero; on error, -1 is returned, and errno is set appropriately.

3,注意:
       The data returned by getifaddrs() is dynamically allocated and should be freed using freeifaddrs() when no longer needed.

4,  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\n",                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\n", gai_strerror(s));                exit(EXIT_FAILURE);            }            printf("\taddress: <%s>\n", host);        }    }    freeifaddrs(ifaddr);    exit(EXIT_SUCCESS);}






原创粉丝点击