使用 Windows API GetAdaptersAddresses ,我们可以获得有关系统上所有网络接口(interface)卡的非常详细的信息。连同所有其他有用的信息,我喜欢关注结构 IP_ADAPTER_ADDRESSES的 IfType 字段。如果您看到,您会发现在 Ipifcons.h 中定义了 244 个可能的值,并且这些类型是由互联网名称分配机构 (IANA) 定义的。
我的问题是,以编程方式,是否有任何方法(如 Linux API 或 ioctls)使用 Linux 和可能的 Mac 获取此类特定接口(interface)类型信息?
最佳答案
没有直接的等价物。 Windows API 混合了两个属性:协议(protocol)和驱动程序。
要获取接口(interface)协议(protocol)(以太网、ATM、环回、火线),您可以使用 SIOCGIFHWADDR ioctl,它将返回“Link Encapsulation”。在大多数计算机中,它要么是环回,要么是以太网(大多数设备,包括 Wifi、隧道等都是以太网)。此信息由“ifconfig”工具显示:
$ ifconfig | grep encap
eth0 Link encap:Ethernet HWaddr 00:21:cc:xx:xx:xx
lo Link encap:Local Loopback
virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
wlan0 Link encap:Ethernet HWaddr 00:24:d7:xx:xx:xx
要获取接口(interface)驱动程序,您可以探索/sys/class/net/INTERFACE/device/路径。然后你可以使用各种启发式方法:
# get driver name
$ readlink /sys/class/net/eth0/device/driver
../../../bus/pci/drivers/e1000e
$ readlink /sys/class/net/wlan0/device/driver
../../../../bus/pci/drivers/iwlwifi
# check if it is wifi or not
$ ls -l /sys/class/net/wlan0/wireless/status
-r--r--r-- 1 root root 4096 Sep 2 15:42 /sys/class/net/wlan0/wireless/status
$ ls -l /sys/class/net/eth0/wireless/status
ls: cannot access /sys/class/net/eth0/wireless/status: No such file or directory
关于c - 如何在 Linux 和 Mac OSx 中获得更高级的网络接口(interface)卡类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17327942/