基本上是 Swift 对 getifaddrs
的抽象;一种枚举当前主机上所有网络接口的方式,包含其核心信息,例如关联的地址和子网掩码。
这被有意设计得非常轻量级,并且即使在您查找接口的一小部分子集时,也旨在非常高效。例如,查找所有活动的 IPv4 地址(不包括环回网络)。
import NetworkInterfaceInfo
try NetworkInterface.all
.filter { $0.up // Only active network interfaces…
&& !$0.loopback } // Ignoring loopback interfaces…
.compactMap(\.address) // That have addresses and…
.filter(\.isIPv4) // Use IPv4.
仅在 macOS 上,接口指标也可用 - 包括配置值(例如 MTU 和线路速度),以及计数器(例如已发送和接收的字节和数据包)。
请参阅文档以获取更多详细信息。
还有一个额外的模块,允许您监控网络接口的变更,如下例所示。
注意:这个额外的模块目前仅在提供 Apple Network 包的平台上实现(即 Apple 平台,而非 Linux 或 Windows)。
import NetworkInterfaceInfo
import NetworkInterfaceChangeMonitoring
for try await change in NetworkInterface.changes() {
switch change.nature {
case .added:
print("New network interface: \(change.interface)")
case .modified(let modificationNature):
if modificationNature.contains(.address) {
print("Address changed to \(change.interface.address).")
}
case .removed:
// etc
}
}
注意:您仍然需要显式 import NetworkInterfaceInfo
才能访问 changes
方法并以其他方式使用 NetworkInterface
等。
此监控功能位于单独的模块中,这样如果您不需要它,则无需为此付出代价。
重要提示:监控网络接口变更依赖于 Apple 的 NWPathMonitor
类。通常,它可以几乎立即注意到变更,但有时会延迟 - 甚至延迟几分钟。这可能会在本库的未来版本中得到解决,但至少目前请注意这种令人烦恼的不确定性,并考虑采取措施来解决它(例如,如果您需要明确的延迟上限,则轮询 NetworkInterface.all
代替)。