我不知道是否有一个更紧凑的方法来find链接速度和Linux中的networking接口的types(无线,以太网),而不是打开并读取/sys/class/net/eth0/type
和/sys/class/net/eth0/speed
文件。
如果没有,谁能告诉我在哪里可以find/sys/class/net/eth0/type
返回的数字,在哪种networkingtypes对应?
编辑:它变得更糟! 经过一些无线的实验, /sys/class/net/wlan0/type
也返回1,而/sys/class/net/wlan0/speed
不存在,我必须从/sys/class/net/wlan0/wireless/link
有时会返回不正确的速度。 例如在54Mbits卡中有时会返回55。
提前致谢!
这只能解决你的问题的一半,但与库libpcap你可以打开一个活的pcap_t,然后调用pcap_datalink。 这会给你的链接类型。 (DLT_IEEE802_11,DLT_EN10MB等)
要获得链路类型(以太网,802.11等),您可以使用SIOCGIFHWADDR
ioctl。 ioctl返回struct sockaddr
的sa_family
中的一个ARPHRD_
值(在net/if_arp.h
定义)。 请参阅man netdevice(7)了解更多详情。
看一个例子(未测试):
/** * Get network interface link type * @param name the network interface name * @return <0 error code on error, the ARPHRD_ link type otherwise */ int get_link_type(const char* name) { int rv; int fd; struct ifreq ifr; if (strlen(name) >= IFNAMSIZ) { fprintf(stderr, "Name '%s' is too long\n", name); return -ENAMETOOLONG; } strncpy(ifr.ifr_name, name, IFNAMSIZ); fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (fd < 0) return fd; rv = ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); if (rv < 0) return rv; { char *type = "Unknown"; switch (ifr.ifr_hwaddr.sa_family) { case ARPHRD_ETHER: type = "Ethernet"; break; case ARPHRD_IEEE80211: type = "802.11"; break; /* add more cases here */ } printf("Link type is: %s\n", type); } return ifr.ifr_hwaddr.sa_family; }
为了获得链接速度,您需要在SIOCETHTOOL
讨论的SIOCETHTOOL
ioctl。