zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Python_soket
    Python_正则表达式语法
    Python_math模块
    Python_random模块
    Python_os模块
    Python_time模块
    Java技能树-图片版
    读书笔记---《编写可读代码的艺术》
    Java代码优化建议
    Git常用命令
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2779671.html
Copyright © 2011-2022 走看看