How to check if interface is up

泄露秘密 提交于 2019-12-04 11:42:46

问题


Title pretty much says it all. If I run ifconfig, I get this:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet -snip-  netmask 255.255.255.0  broadcast -snip-
    ...

Using this, I can know if it's up or not (<UP,...), but I want to be able to do this in C (or C++, if there is a simpler solution there) without relying on parsing external processes.


Here is what I've got so far (doesn't work):

bool is_interface_online(std::string interface) {
    struct ifreq ifr;
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, interface.c_str());
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
            perror("SIOCGIFFLAGS");
    }
    close(sock);
    return !!(ifr.ifr_flags | IFF_UP);
}

Can anyone point me in the correct direction for this?


回答1:


Answer was simple: I used the bitwise OR (|) operator instead of the AND (&) operator. Fixed code is:

bool is_interface_online(std::string interface) {
    struct ifreq ifr;
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, interface.c_str());
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
            perror("SIOCGIFFLAGS");
    }
    close(sock);
    return !!(ifr.ifr_flags & IFF_UP);
}



回答2:


Have you considered using the strace command to see how ifconfig works? you can even see what parameters are passed to functions and other interesting details of how ifconfig works ..




回答3:


If you care about the up/down state of the interface you might want to use the "IFF_RUNNING" flag instead of the "IFF_UP" flag provided by the current answer.



来源:https://stackoverflow.com/questions/15723061/how-to-check-if-interface-is-up

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!