我想知道是否有一种更紧凑的方法可以在Linux中找到网络接口的链接速度和类型(无线,以太网),而不仅仅是打开并阅读/sys/class/net/eth0/type
和/sys/class/net/eth0/speed
例如。
如果没有,有人能告诉我在哪里可以找到/sys/class/net/eth0/type
返回的号码,网络类型对应哪个?
编辑:情况变得更糟!在使用无线进行一些实验后,/sys/class/net/wlan0/type
也返回1,并且/sys/class/net/wlan0/speed
不存在,我必须从/sys/class/net/wlan0/wireless/link
获取链接速度,这有时会返回不正确的速度。例如,在54Mbits卡中,有时会返回55.
提前致谢!
答案 0 :(得分:0)
这只能解决你的问题的一半,但是使用库libpcap,你可以打开一个live pcap_t,然后调用pcap_datalink。这将为您提供链接类型。 (DLT_IEEE802_11,DLT_EN10MB等)
答案 1 :(得分:0)
要获取链接类型(以太网,802.11等),您可以使用SIOCGIFHWADDR
ioctl。 ioctl会在ARPHRD_
的{{1}}中返回net/if_arp.h
个值之一(在sa_family
中定义)。有关详细信息,请参阅man netdevice(7)。
查看示例(未测试):
struct sockaddr
要获得链接速度,您需要/**
* 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;
}
ioctl,例如here所述。