Dart NetworkInterface
最后修改于 2025 年 4 月 4 日
Dart 中的 NetworkInterface 类提供了访问网络接口信息的功能。它允许查询可用的网络接口及其地址。
NetworkInterface 是 Dart 的 dart:io 库的一部分。它在网络编程、服务器配置和网络诊断方面非常有用。
基本定义
NetworkInterface 表示主机系统上可用的网络接口。每个接口都有一个名称和关联的地址列表。
主要属性包括接口名称、地址列表以及地址类型(IPv4 或 IPv6)。该类提供了列出所有接口的静态方法。
列出所有网络接口
此示例显示了如何列出所有可用的网络接口。
main.dart
import 'dart:io';
void main() async {
try {
List<NetworkInterface> interfaces =
await NetworkInterface.list();
for (var interface in interfaces) {
print('Interface: ${interface.name}');
for (var addr in interface.addresses) {
print(' ${addr.address} (${addr.type.name})');
}
}
} catch (e) {
print('Error: $e');
}
}
我们使用 NetworkInterface.list() 来获取所有接口。这会返回一个 Future,我们对其进行 await。对于每个接口,我们打印其名称和关联的地址。
$ dart main.dart Interface: eth0 192.168.1.100 (IPv4) fe80::a00:27ff:fe4a:1234 (IPv6) Interface: lo 127.0.0.1 (IPv4) ::1 (IPv6)
按接口类型过滤
此示例演示了如何按地址类型过滤接口。
main.dart
import 'dart:io';
void main() async {
var interfaces = await NetworkInterface.list(
includeLoopback: false,
type: InternetAddressType.IPv4
);
print('Non-loopback IPv4 interfaces:');
for (var interface in interfaces) {
print('${interface.name}:');
interface.addresses.forEach(print);
}
}
我们过滤接口以排除回环地址,并且只显示 IPv4 地址。list 方法接受参数来自定义返回的接口列表。
$ dart main.dart Non-loopback IPv4 interfaces: eth0: 192.168.1.100 wlan0: 10.0.0.15
检查特定地址
此示例检查某个特定 IP 地址是否存在于任何接口上。
main.dart
import 'dart:io';
void main() async {
const targetIp = '192.168.1.100';
bool found = false;
var interfaces = await NetworkInterface.list();
for (var interface in interfaces) {
for (var addr in interface.addresses) {
if (addr.address == targetIp) {
found = true;
print('$targetIp found on ${interface.name}');
break;
}
}
if (found) break;
}
if (!found) {
print('$targetIp not found on any interface');
}
}
我们在所有接口中搜索一个特定的 IP 地址。这对于验证网络配置或以编程方式检查接口分配非常有用。
$ dart main.dart 192.168.1.100 found on eth0
按名称获取接口
此示例显示了如何按名称获取特定接口的详细信息。
main.dart
import 'dart:io';
void main() async {
const interfaceName = 'eth0';
var interfaces = await NetworkInterface.list();
var targetInterface = interfaces.firstWhere(
(i) => i.name == interfaceName,
orElse: () => null
);
if (targetInterface != null) {
print('Details for $interfaceName:');
print('Addresses:');
targetInterface.addresses.forEach(print);
} else {
print('Interface $interfaceName not found');
}
}
我们通过其名称查找一个接口并显示其地址。firstWhere 方法有助于从完整列表中定位特定接口。
$ dart main.dart Details for eth0: Addresses: 192.168.1.100 fe80::a00:27ff:fe4a:1234
监控接口更改
此示例演示了如何监控网络接口的更改。
main.dart
import 'dart:io';
import 'dart:async';
void main() async {
print('Initial interfaces:');
var initial = await NetworkInterface.list();
printInterfaces(initial);
print('\nMonitoring for changes (Ctrl+C to stop)...');
Timer.periodic(Duration(seconds: 5), (timer) async {
var current = await NetworkInterface.list();
if (interfacesChanged(initial, current)) {
print('\nInterface change detected:');
printInterfaces(current);
initial = current;
}
});
}
bool interfacesChanged(List<NetworkInterface> a, List<NetworkInterface> b) {
if (a.length != b.length) return true;
for (int i = 0; i < a.length; i++) {
if (a[i].name != b[i].name ||
a[i].addresses.length != b[i].addresses.length) {
return true;
}
}
return false;
}
void printInterfaces(List<NetworkInterface> interfaces) {
for (var interface in interfaces) {
print('${interface.name}:');
interface.addresses.forEach((addr) => print(' ${addr.address}'));
}
}
我们通过比较当前状态和初始状态来定期检查接口更改。这可以在运行时检测网络配置更改。
$ dart main.dart Initial interfaces: eth0: 192.168.1.100 lo: 127.0.0.1 Monitoring for changes (Ctrl+C to stop)... Interface change detected: eth0: 192.168.1.100 wlan0: 10.0.0.15 lo: 127.0.0.1
最佳实践
- 错误处理:始终处理潜在的异常
- Async/await:使用 async/await 使代码更简洁
- 过滤:尽可能过滤结果以提高效率
- IPv6 支持:在现代应用程序中考虑 IPv6 地址
- 平台差异:注意平台特定的行为
来源
本教程介绍了 Dart 的 NetworkInterface 类,并通过实际示例展示了接口列表、过滤、监控和地址管理。
作者
列出 所有 Dart 教程。