代码之家  ›  专栏  ›  技术社区  ›  Coderer

从接口名称查找IP地址

  •  5
  • Coderer  · 技术社区  · 16 年前

    在Linux机器上,常见的接口名称看起来像eth0、eth1等。我知道如何使用查找至少一个IP地址 gethostbyname 或者类似的函数,但我不知道如何指定我想要哪个命名接口的IP地址。我可以使用ifconfig解析输出,但似乎需要花费大量时间来获取这些信息。..不雅。

    有没有一种方法可以将所有接口及其IP地址(可能还有MAC地址)枚举到一个集合中?或者至少是一些类似的东西 gethostbyinterface("eth0") ?

    2 回复  |  直到 9 年前
        1
  •  10
  •   Walter    7 年前
    // Originally from http://www.tlug.org.za/wiki/index.php/Obtaining_your_own_IP_address
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>
    
    /**
     * getIPv4()
     *
     * This function takes a network identifier such as "eth0" or "eth0:0" and
     * a pointer to a buffer of at least 16 bytes and then stores the IP of that
     * device gets stored in that buffer.
     *
     * it return 0 on success or -1 on failure.
     *
     * Author:  Jaco Kroon <jaco@kroon.co.za>
     */
    int getIPv4(const char * dev, char * ipv4) {
        struct ifreq ifc;
        int res;
        int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
        if(sockfd < 0)
            return -1;
        strcpy(ifc.ifr_name, dev);
        res = ioctl(sockfd, SIOCGIFADDR, &ifc);
        close(sockfd);
        if(res < 0)
            return -1;     
        strcpy(ipv4, inet_ntoa(((struct sockaddr_in*)&ifc.ifr_addr)->sin_addr));
        return 0;
    }
    
    
    int main() {
        char ip[16];
        if(getIPv4("eth0", ip) == 0)
            printf("IPv4: %s\n", ip);
        else
            printf("No IP\n");
        return 0;
     }
    

    更新 :将死链接移动到评论(供后人使用)(谢谢@obayhan),并添加了语法高亮显示。

        2
  •  3
  •   Paweł Hajdan    16 年前

    编辑: 我看到你不喜欢炮击。然后,您可以看看ifconfig是如何工作的(它至少从/proc中提取了一些信息)。

    当你有接口名称时,你可以这样做(在你的shell中):

    ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'
    

    要枚举接口,您可以使用以下命令:

    ifconfig | egrep '^[^ ]' | awk '{print $1}'
    

    组合:

    for x in `ifconfig | egrep '^[^ ]' | awk '{print $1}'`; do
      echo -n "${x}"
      echo -n "    "
      ifconfig "${x}" | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'
    done