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

标签 c linux macos network-programming network-interface

使用 Windows API GetAdaptersAddresses ,我们可以获得有关系统上所有网络接口(interface)卡的非常详细的信息。连同所有其他有用的信息,我喜欢关注结构 IP_ADAPTER_ADDRESSESIfType 字段。如果您看到,您会发现在 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/

相关文章:

c - stm32f103c8t6 USART1中断不起作用

c - 由于简单错误,lex 文件未编译

linux - 我可以将 DLL 项目编译为 ARM 的共享对象 (.so) 文件吗?

linux - 写入时将文件内容 move 到另一个文件

c - 指针作为返回值

c - 如何在我的链表中动态插入字符串?

linux - GTK 中的阿拉伯语本地化

javascript - Chrome应用程序文件系统API : Suggested file name has no extension in OSX

ios - Swift 对象的安全内存

java - Mac 操作系统 Chrome 浏览器 : Archive Utility (Error 1) - Operation not permitted: Unable to expand downloaded zip