【问题标题】:How to check if interface is up如何检查接口是否启动
【发布时间】:2013-03-30 20:19:43
【问题描述】:

标题几乎说明了一切。如果我运行ifconfig,我会得到:

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

使用它,我可以知道它是否启动 (&lt;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);
}

谁能指出我正确的方向?

【问题讨论】:

  • ifconfig 是开源的顺便说一句
  • 如果您的接口不使用 IPv6,则会失败。

标签: c++ linux ioctl


【解决方案1】:

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

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】:

    如果您关心接口的启动/关闭状态,您可能希望使用“IFF_RUNNING”标志而不是当前答案提供的“IFF_UP”标志。

    【讨论】:

    • 我可以在虚拟环境中使用它吗?如何在虚拟环境中设置接口?我正在运行测试程序,它每 500 毫秒检查一次 IFF_RUNNING 标志。我没有收到接口关闭,它总是发现 IFF_RUNNING 标志设置。在这件事上需要帮助。
    【解决方案3】:

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

    【讨论】:

    • 是的,事实上,这就是我用来编写函数的内容:D
    • 我知道这是一篇非常古老的帖子,但返回语句中!! 的目的是什么?我不知道!! 运算符,所以这仅仅是“不是”吗?如果是这样,则可以删除!!
    • 回答有点晚,但两个!! 的目的很简单。它用于从大型返回退出代码返回 0 或 1。示例 !! 0 将返回 0,因为 !0 = 1!1 = 0。但是对于任何其他值n != 0,它将返回1。以!!10 为例:!10 = 0!0 = 1
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2021-09-30
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多