如何检查是否接口高达

问题描述:

标题几乎说明了一切。如果我运行ifconfig,我得到这个:如何检查是否接口高达

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

利用这一点,我可以知道这是否涨不跌(<UP,...),但我希望能够做到这一点在C(或C++,如果有有更简单的解决方案),而不依赖于解析外部进程。


这里是我到目前为止(不工作)了:

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

的ifconfig是开源的BTW – Slava

答案很简单:我用位运算符(|)而不是运算符(&)。固定的代码是:

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); 
} 
+1

我还测试了我的Fedora 18的机器上,做工精细。 –

你有使用strace命令怎么看ifconfig作品考虑?你甚至可以看到参数传递给函数,以及如何ifconfig作品的其他有趣的细节..

+2

是的,我的,其实,这是我以前写的函数:d – MiJyn

如果你关心界面的向上/向下状态则可能需要使用“IFF_RUNNING”标志,而不是“由当前的答案提供IFF_UP”标志。