如何在Linux中检查以太网?

RAM*_*812 6 c linux ethernet

我需要使用C代码检查Linux中的以太网测试用例eth0.如果eth0是关闭,我们启用网络,然后检查是否已经通过测试.

Tru*_*ueY 10

要检查链接是否已启动,请尝试以下操作.它没有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"));
}
Run Code Online (Sandbox Code Playgroud)

如果设置了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;
}
Run Code Online (Sandbox Code Playgroud)


Yan*_*min 3

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