9

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

4

5 回答 5

13

要检查链接是否正常,请尝试这样的操作。它可以在没有 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;
}
于 2013-04-09T14:52:53.083 回答
3

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

于 2010-11-20T06:36:30.257 回答
2

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

http://www.signal11.us/oss/udev/
于 2010-11-20T06:54:21.523 回答
1

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

于 2015-03-31T14:17:26.443 回答
1

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

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

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

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

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


我错过了注意到您正在寻找 ac 代码。也许添加标签会很好。

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

于 2012-09-08T10:26:09.023 回答