ZetCode

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

最佳实践

来源

Dart NetworkInterface 文档

本教程介绍了 Dart 的 NetworkInterface 类,并通过实际示例展示了接口列表、过滤、监控和地址管理。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面有十多年的经验。

列出 所有 Dart 教程