如何在Linux中检查以太网?

如何在Linux中检查以太网?

问题描述:

我需要在Linux中使用C代码检查eth0以太网测试案例。如果eth0停机,我们启用网络,然后检查是否启动并且测试已通过。如何在Linux中检查以太网?

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

你可能要采取libudev的优势来获得/ SYS各地:

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

我只是检查,如果一个IP地址被分配给网卡。

您可以使用这样的检查,如果局域网是向上在给定的网络卡(比如为eth0):

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

基于与否的IP地址是0或1本应该简单地返回被分配给nic。

也可以使用Yann Ramin的方法列出所有网点的&执行检查。


我错过了注意到你正在寻找一个c代码。也许添加标签会很好。

无论哪种方式,我认为你可以看看相同的文件(ifconfig)在c中手动读取它的IP。

要检查链接是否启动,请尝试类似这样的操作。它没有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; 
} 
+0

@TrueY:一个问题,假设我只是想获得链接的状态通过ETHTOOL_GLINK与SIOCGIFFLAGS获取它的区别是什么? 'ethtool_value.data == 1'是否暗示'IFF_UP'和'IFF_RUNNING'。我在http://*.com/questions/33039485/siocethtool-vs-siocgmiiphy-vs-siocgifflags上询问了关于此的详细问题。请让我知道你的想法 – 2015-10-10 20:45:25

+0

@Vivek这是很久以前,但我认为,如果edata.data == 1那么接口是UP和RUNNING。 – TrueY 2015-10-11 21:09:22

由于这个问题有点重要,我会添加另一个答案,尽管它的极端年龄。您可以阅读/ sys/class/net/eth0/operstate的内容,它只包含字符串“up \ n”或“down \ n”。