如何检查界面是否已启动

时间:2013-03-30 20:19:43

标签: c++ linux ioctl

标题几乎说明了一切。如果我运行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);
}

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:16)

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

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 :(得分:4)

如果你关心接口的up / down状态,你可能想要使用“IFF_RUNNING”标志而不是当前答案提供的“IFF_UP”标志。

答案 2 :(得分:3)

您是否考虑过使用strace命令查看ifconfig的工作原理?你甚至可以看到传递给函数的参数以及ifconfig如何工作的其他有趣细节。