【问题标题】:How to check Ethernet in Linux?如何在 Linux 中检查以太网?
【发布时间】:2021-10-30 01:57:33
【问题描述】:

我需要 Linux 中的以太网测试用例,使用 C 代码检查eth0。如果eth0 宕机,我们开启网络,然后检查是否在线,测试通过。

【问题讨论】:

    标签: c linux ethernet


    【解决方案1】:

    要检查链接是否正常,请尝试以下操作。它可以在没有 root 权限的情况下工作。

    #include <stdio.h>        // printf
    #include <string.h>       // strncpy
    //#include <sys/socket.h> // AF_INET
    #include <sys/ioctl.h>    // SIOCGIFFLAGS
    #include <errno.h>        // errno
    #include <netinet/in.h>   // IPPROTO_IP
    #include <net/if.h>       // IFF_*, ifreq
    
    #define ERROR(fmt, ...) do { printf(fmt, __VA_ARGS__); return -1; } while(0)
    
    int CheckLink(char *ifname) {
        int state = -1;
        int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
        if (socId < 0) ERROR("Socket failed. Errno = %d\n", errno);
    
        struct ifreq if_req;
        (void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name));
        int rv = ioctl(socId, SIOCGIFFLAGS, &if_req);
        close(socId);
    
        if ( rv == -1) ERROR("Ioctl failed. Errno = %d\n", errno);
    
        return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING);
    }
    
    int main() {
        printf("%d\n", CheckLink("eth0"));
    }
    

    如果设置了 IFF_UP,则表示接口已启动(参见 ifup)。如果设置了 IFF_RUNNING,则接口被插入。 我也尝试使用 ethtool ioctl 调用,但是当 gid 不是 root 时它失败了。但只是为了日志:

    ...
    #include <asm/types.h>     // __u32
    #include <linux/ethtool.h> // ETHTOOL_GLINK
    #include <linux/sockios.h> // SIOCETHTOOL
    ...
    int CheckLink(char *ifname) {
        ...
        struct ifreq if_req;
        (void) strncpy( if_req.ifr_name, ifname, sizeof(if_req.ifr_name) );
    
        struct ethtool_value edata;
        edata.cmd = ETHTOOL_GLINK;
        if_req.ifr_data = (char*) &edata;
    
        int rv = ioctl(socId, SIOCETHTOOL, &if_req);
        ...
    
        return !!edata.data;
    }
    

    【讨论】:

    • @TrueY:一个问题,假设我只想获取链接的状态,通过 ETHTOOL_GLINK 与 SIOCGIFFLAGS 获取它有什么区别? ethtool_value.data == 1 是否暗示 IFF_UPIFF_RUNNING。我已经在stackoverflow.com/questions/33039485/… 提出了一个详细的问题。请让我知道您对此的看法
    • @Vivek 这是很久以前的事了,但我认为如果 edata.data == 1 那么接口是 UP 和 RUNNING。
    • 我可以在虚拟环境中使用它吗?如何在虚拟环境中设置接口?我正在运行测试程序,它每 500 毫秒检查一次 IFF_RUNNING 标志。我没有收到接口关闭,它总是发现 IFF_RUNNING 标志设置。在这件事上需要帮助。
    【解决方案2】:

    可以在sysfs:/sys/class/net/eth[x] 中看到网络接口。在那里您可以检查链接、接口状态等。

    【讨论】:

      【解决方案3】:

      您可能想利用 libudev 在 /sys 中四处走动:

      http://www.signal11.us/oss/udev/
      

      【讨论】:

        【解决方案4】:

        我只是检查是否为网卡分配了 IP 地址。

        您可以使用类似的方法来检查给定网卡中的 lan 是否已启动(例如 eth0):

        /sbin/ifconfig eth0| grep 'inet addr:' | wc -l
        

        这应该根据是否将 ip 地址分配给 nic 来简单地返回 0 或 1。

        您也可以使用 Yann Ramin 的 方法列出所有 nic 并执行检查。


        我没有注意到您正在寻找 c 代码。或许加个标签就好了。

        无论哪种方式,我认为您可以通过读取 ip 在 c 中手动查看同一个文件 (ifconfig)。

        【讨论】:

          【解决方案5】:

          由于这个问题有点重要,我会添加另一个答案,尽管它已经很老了。您可以阅读 /sys/class/net/eth0/operstate 的内容,其中仅包含字符串“up\n”或“down\n”。

          【讨论】:

            猜你喜欢
            • 2019-05-15
            • 1970-01-01
            • 2011-01-06
            • 2013-06-20
            • 1970-01-01
            • 2014-09-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多