我不知道是否有找到链接速度和类型在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。
提前致谢!
这不仅解决了一半的问题,但与库libpcap的,你可以打开一个活pcap_t,然后调用pcap_datalink。 这会给你的链接类型。 (DLT_IEEE802_11,DLT_EN10MB等)
- http://www.tcpdump.org/pcap3_man.html
- http://www.manpagez.com/man/3/pcap_datalink/
要获得链路类型(以太网,802.11等),您可以使用SIOCGIFHWADDR
IOCTL。 所述IOCTL返回之一ARPHRD_
值(定义在net/if_arp.h
在) sa_family
所述的struct sockaddr
。 见男子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
IOCTL,例如讨论在这里 。