如何在Linux中检查以太网?

我需要使用C代码在Linux中testing以太网的testing用例来检查eth0 。 如果eth0closures,我们启用networking,然后检查是否通过testing。

Solutions Collecting From Web of "如何在Linux中检查以太网?"

要检查链接是否启动,请尝试这样的事情。 它没有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; } 

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

你可能想利用libudev来解决/ sys:

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

我只是检查一个IP地址是否分配给网卡。

您可以使用这样的东西来检查是否在给定的网卡(例如eth0 )的LAN:

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

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

你也可以用Yann Ramin的方法列出所有的网络并执行检查。


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

无论哪种方式,我认为你可以通过读取一个ip来查看同一个文件( ifconfig )。

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