ioctl获取接口名称、IP地址、MAC地址、广播地址等

http://blog.markloiseau.com/2012/02/get-network-interfaces-in-c/
http://www.doctort.org/adam/nerd-notes/enumerating-network-interfaces-on-linux.html
http://www.geekpage.jp/en/programming/linux-network/get-ipaddr.php

 
 
 
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>

/* 自定义一个结构体存放需要的接口信息。*/
struct ifi_info {
	char *ifi_name;
//	char ifi_name[IFNAMSIZ];		/* interface name, null-terminated */
	struct sockaddr ifi_addr;		/* primary address */
	u_char ifi_haddr[8];			/* hardware address*/
	short ifi_index;				/* interface index */
};

int main(void)
{
    char          buf[1024];
    struct ifconf ifc;
    struct ifreq *ifr;
    int           sck;
    int           nInterfaces;
    int           i;

    struct ifi_info myifi_info[10];

    /* Get a socket handle. */
    sck = socket(AF_INET, SOCK_DGRAM, 0);
    if(sck < 0)
    {
        perror("socket");
        return 1;
    }

    /* Query available interfaces. */
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if(ioctl(sck, SIOCGIFCONF, &ifc) < 0)
    {
        perror("ioctl(SIOCGIFCONF)");
        return 1;
    }

    /* Iterate through the list of interfaces. */
    ifr         = ifc.ifc_req;
    nInterfaces = ifc.ifc_len / sizeof(struct ifreq);
    for(i = 0; i < nInterfaces; i++)
    {
        struct ifreq *item = &ifr[i];
        myifi_info[i].ifi_name = item->ifr_name;
        myifi_info[i].ifi_addr = item->ifr_addr;

        /* Show the device name and IP address */
        printf("%s: IP %s",
        		myifi_info[i].ifi_name,
               inet_ntoa(((struct sockaddr_in *)&(myifi_info[i].ifi_addr))->sin_addr));

        /* Get the MAC address */
        if(ioctl(sck, SIOCGIFHWADDR, item) < 0)
        {
            perror("ioctl(SIOCGIFHWADDR)");
            return 1;
        }

//      myifi_info.ifi_haddr = &(item->ifr_hwaddr).sa_data;

        /* Get the broadcast address (added by Eric)*/
        if(ioctl(sck, SIOCGIFBRDADDR, item) >= 0)
            printf(", BROADCAST %s", inet_ntoa(((struct sockaddr_in *)&item->ifr_broadaddr)->sin_addr));
        printf("\n");

    }//end for

        return 0;
}
posted @ 2012-11-20 20:30  helloweworld  阅读(908)  评论(0编辑  收藏  举报