using C code to get same info as ifconfig

前端 未结 6 789
醉话见心
醉话见心 2020-11-27 03:15

Is there a way in Linux, using C code, to get the same information that \"ifconfig eth0\" would return? I\'m interested in things like IP address, link status, and MAC addr

6条回答
  •  失恋的感觉
    2020-11-27 04:05

    void parse_ioctl(const char *ifname)
    {
        printf("%s\n", "scarf rosari...");
        int sock;
        struct ifreq ifr;
        struct sockaddr_in *ipaddr;
        char address[INET_ADDRSTRLEN];
        size_t ifnamelen;
    
        /* copy ifname to ifr object */
        ifnamelen = strlen(ifname);
        if (ifnamelen >= sizeof(ifr.ifr_name)) {
            printf("error :%s\n", ifr.ifr_name);
            return ;
        }
        memcpy(ifr.ifr_name, ifname, ifnamelen);
        ifr.ifr_name[ifnamelen] = '\0';
    
        /* open socket */
        sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
        if (sock < 0) {
            printf("error :%s\n", "unable to open socket..");
            return;
        }
    
        /* process mac */
        if (ioctl(sock, SIOCGIFHWADDR, &ifr) != -1) {
            printf("Mac address: %02x:%02x:%02x:%02x:%02x:%02x\n",
                    (unsigned char)ifr.ifr_hwaddr.sa_data[0],
                    (unsigned char)ifr.ifr_hwaddr.sa_data[1],
                    (unsigned char)ifr.ifr_hwaddr.sa_data[2],
                    (unsigned char)ifr.ifr_hwaddr.sa_data[3],
                    (unsigned char)ifr.ifr_hwaddr.sa_data[4],
                    (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
        }
    
        /* process mtu */
        if (ioctl(sock, SIOCGIFMTU, &ifr) != -1) {
            printf("MTU: %d\n", ifr.ifr_mtu);
        }
    
        /* die if cannot get address */
        if (ioctl(sock, SIOCGIFADDR, &ifr) == -1) {
            close(sock);
            return;
        }
    
        /* process ip */
        ipaddr = (struct sockaddr_in *)&ifr.ifr_addr;
        if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
            printf("Ip address: %s\n", address);
        }
    
        /* try to get broadcast */
        if (ioctl(sock, SIOCGIFBRDADDR, &ifr) != -1) {
            ipaddr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
            if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
                printf("Broadcast: %s\n", address);
            }
        }
    
        /* try to get mask */
        if (ioctl(sock, SIOCGIFNETMASK, &ifr) != -1) {
            ipaddr = (struct sockaddr_in *)&ifr.ifr_netmask;
            if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
                printf("Netmask: %s\n", address);
            }
        }
    
        close(sock);
    }
    

    usage :

    parse_ioctl("eth0");
    

提交回复
热议问题