9

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

谁能指出我正确的方向?

4

3 回答 3

22

答案很简单:我使用了按位 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);
}
于 2013-03-30T20:37:44.103 回答
5

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.

于 2017-03-12T22:10:16.830 回答
4

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

于 2013-03-31T08:06:25.737 回答