通过ifconf 获取所有接口的名字和地址

ifconf 结构中保存着所有接口的信息, 可以通过以下步骤获取:

  1. 通过ioctl 获取本地所有接口的信息, 并保存到ifconf中

  2. 从ifconf中循环取出每一个ifreq结构

注意:

  • 在程序开始时需要对ifconf中的ifc_len和ifc_buf进行初始化;
  • 使用ioctl 获取所有接口信息后,ifc_len内存放实际获得的接口信息的总长度
#include <stdio.h>
#include <net/if.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>


int main() {
    int sockfd, len, i;
    char buf[2048], addrstr[INET_ADDRSTRLEN];

    struct ifconf ifc;
    struct ifreq *ifr;
    struct sockaddr_in *sinptr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_req = (struct ifreq *) buf;

    ioctl(sockfd, SIOCGIFCONF, &ifc);

    len = ifc.ifc_len / sizeof(struct ifreq); 

    ifr = (struct ifreq *) buf;
    for (i=0; i< len; i++) {
        switch (ifr->ifr_addr.sa_family) {
            case AF_INET: 
                sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
                printf("%s\t%s\n", ifr->ifr_name,
                        inet_ntop(AF_INET, &sinptr->sin_addr, addrstr, sizeof(addrstr)));
                break;
            default:
                printf("%s\n", ifr->ifr_name);
                break;
        }
        ifr++;
    } 

    return 0;
}

执行结果:

[root@iz2zecj7a5r32f2axsctb9z ifconfig]# ./lsif
lo    127.0.0.1
eth0    172.17.147.135
docker0    172.18.0.1
文档更新时间: 2021-02-02 18:49   作者:周国强