Linux下判断网线是否插入的代码
来源:互联网 发布:淘宝助理怎么上传新图 编辑:程序博客网 时间:2024/05/22 06:53
Linux下判断网线是否插入的代码参考ethtool-2.6.36.tar.gz 代码:[guowenxue@localhost ~]$ sudo ethtool eth0Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised auto-negotiation: Yes Speed: 100Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000033 (51) Link detected: yes 下面是剥离开来的专门用来探测网线的源代码:[guowenxue@localhost ~]$ cat test.c #include <sys/types.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <net/if.h>#include <sys/utsname.h>#include <limits.h>#include <ctype.h> #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> #include <linux/sockios.h> #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */struct ethtool_value { unsigned int cmd; unsigned int data; }; int get_netlink_status(const char *if_name); int main(int argc, char *argv[]){ if (argc != 2) { fprintf(stderr, "usage: %s <ethname>\n", argv[0]); return -1; } if (getuid() != 0) { fprintf(stderr, "Netlink Status Check Need Root user.\n"); return 1; } printf("Net link status: %s\n", get_netlink_status(argv[1]) == 1 ? "up" : "down"); return 0;} // if_name like "ath0", "eth0". Notice: call this function// need root privilege.// return value:// -1 -- error , details can check errno// 1 -- interface link up// 0 -- interface link down.int get_netlink_status(const char *if_name){ int skfd; struct ifreq ifr; struct ethtool_value edata; edata.cmd = ETHTOOL_GLINK; edata.data = 0; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1); ifr.ifr_data = (char *)&edata; if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) return -1; if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1) { close(skfd); return -1; } close(skfd); return edata.data;} /tmp >: ifconfigeth0 Link encap:Ethernet HWaddr 00:60:C2:69:06:B5 inet addr:10.78.28.114 Bcast:10.78.28.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 这里RUNNING可以看出eth1的网线插好了 RX packets:498 errors:0 dropped:0 overruns:0 frame:0 TX packets:117 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:56899 (55.5 KiB) TX bytes:11718 (11.4 KiB) Interrupt:111 Base address:0x6000 eth1 Link encap:Ethernet HWaddr 00:60:C2:69:06:B6 inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 这里可以看出eth1的网线没插入 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:21 Base address:0x4000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) /tmp >: ./test eth0Net link status: up/tmp >: ./test eth1Net link status: down这段代码在AT91SAM9260+DM9000/DM9161上都能正常工作,但在W90P710上不能工作,可能是W90P710的DM9000的驱动有问题。