如何在Linux和Mac OSx中获得更高级的网络接口卡类型

如何在Linux和Mac OSx中获得更高级的网络接口卡类型,c,linux,macos,network-programming,network-interface,C,Linux,Macos,Network Programming,Network Interface,使用Windows API,我们可以获得有关系统上所有网络接口卡的详细信息。除了所有其他有用的信息外,我喜欢关注结构的IfType字段。如果您看到,您将发现在Ipifcons.h中定义了244个可能的值,这些值是由Internet分配名称管理局(IANA)定义的 我的问题是,在编程方面,是否有任何方法,如Linux API或IOCTL,可以使用Linux和Mac获得此类特定的接口类型信息?没有直接的等效方法。Windows API混合了两个属性:协议和驱动程序 要获得接口协议(以太网、ATM、环

使用Windows API,我们可以获得有关系统上所有网络接口卡的详细信息。除了所有其他有用的信息外,我喜欢关注结构的IfType字段。如果您看到,您将发现在Ipifcons.h中定义了244个可能的值,这些值是由Internet分配名称管理局(IANA)定义的


我的问题是,在编程方面,是否有任何方法,如Linux API或IOCTL,可以使用Linux和Mac获得此类特定的接口类型信息?

没有直接的等效方法。Windows API混合了两个属性:协议和驱动程序

要获得接口协议(以太网、ATM、环回、火线),您可以使用SIOCGIFHWADDR ioctl,它将返回“链路封装”。在大多数计算机中,它将是环回或以太网(大多数设备,包括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
要获取接口驱动程序,您可以浏览/sys/class/net/interface/device/path。然后,您可以使用各种启发式方法:

# 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