Skip to content

Commit 4d6a355

Browse files
committed
feat: add explicit IPv4/IPv6 selection to NAT diagnostics
1 parent b651098 commit 4d6a355

5 files changed

Lines changed: 37 additions & 128 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626

2727
这个项目是一个用于 **NAT 行为检测与 STUN 诊断** 的 Flutter 应用,当前界面采用 Fluent UI 风格,适合在桌面环境下作为网络测试小工具使用。它可以帮助你观察当前网络是否经过 NAT、NAT 的映射与过滤策略、服务端能力、映射存活时间估算,以及一些更偏工程诊断用途的扩展指标。
2828

29-
相较于只返回一个“能不能通”的简单测试工具,这个项目更偏向“**把网络行为拆开来看**”。你既可以直接选择公开 STUN 服务快速执行测试,也可以手动调整本地绑定地址、端口、超时、重传、分片填充等参数,观察不同网络环境下的响应差异。
29+
相较于只返回一个“能不能通”的简单测试工具,这个项目更偏向“**把网络行为拆开来看**”。你既可以直接选择公开 STUN 服务快速执行测试,也可以手动调整本地绑定地址、端口、地址族、超时、重传、分片填充等参数,观察不同网络环境下的响应差异。
3030

3131
## 功能亮点
3232

3333
- 支持填写或选择目标 STUN 服务 URI,快速发起 NAT 探测。
3434
- 支持自定义本地绑定 IP 与端口,便于多网卡或特定出口场景验证。
35+
- 支持显式选择 `自动 / IPv4 / IPv6` 地址族,便于固定目标解析结果与 socket 地址族。
3536
- 支持检测网络可达性、是否存在 NAT、公网映射地址与服务端端点。
3637
- 支持分析 NAT 映射行为、过滤行为以及传统 NAT 类型归类。
3738
- 支持估算 Binding Lifetime,辅助判断映射在空闲状态下可维持多久。

lib/pages/nat_diagnostics_page.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
1+
import 'dart:io';
2+
13
import 'package:fluent_ui/fluent_ui.dart';
24
import 'package:flutter_hooks/flutter_hooks.dart';
35
import 'package:nat_tester/value_formatters.dart';
46
import 'package:nat_tester/widgets/editable_combo_action_tile.dart';
57
import 'package:nat_tester/widgets/expander_section.dart';
68
import 'package:nat_tester/widgets/number_field_tile.dart';
79
import 'package:nat_tester/widgets/read_only_value_tile.dart';
10+
import 'package:nat_tester/widgets/select_field_tile.dart';
811
import 'package:nat_tester/widgets/switch_tile.dart';
912
import 'package:nat_tester/widgets/text_field_tile.dart';
1013
import 'package:stun/stun.dart';
1114

15+
enum _AddressFamilyOption {
16+
auto(null, '自动 (Auto)'),
17+
ipv4(InternetAddressType.IPv4, 'IPv4'),
18+
ipv6(InternetAddressType.IPv6, 'IPv6');
19+
20+
const _AddressFamilyOption(this.type, this.label);
21+
22+
final InternetAddressType? type;
23+
final String label;
24+
25+
@override
26+
String toString() => label;
27+
}
28+
1229
class NatDiagnosticsPage extends HookWidget {
1330
static const int _maxLogEntries = 200;
1431

@@ -18,6 +35,7 @@ class NatDiagnosticsPage extends HookWidget {
1835
Widget build(BuildContext context) {
1936
final serverUri = useState<String>('stun:stun.hot-chilli.net:3478');
2037
final localIp = useState<String>('');
38+
final addressFamily = useState<_AddressFamilyOption>(_AddressFamilyOption.auto);
2139
final localPort = useState<int>(0);
2240
final initialRtoMs = useState<int>(200);
2341
final maxRetransmissions = useState<int>(2);
@@ -102,6 +120,7 @@ class NatDiagnosticsPage extends HookWidget {
102120
localIp: localIp.value.isEmpty
103121
? null
104122
: localIp.value,
123+
addressType: addressFamily.value.type,
105124
localPort: localPort.value,
106125
initialRto: Duration(
107126
milliseconds: initialRtoMs.value,
@@ -161,6 +180,17 @@ class NatDiagnosticsPage extends HookWidget {
161180
localIp.value = value;
162181
},
163182
),
183+
SelectFieldTile<_AddressFamilyOption>(
184+
icon: FluentIcons.internet_sharing,
185+
title: '地址族选择 (Address Family)',
186+
description:
187+
'自动模式会跟随目标解析结果;选择 IPv4 或 IPv6 后,只使用对应地址族的 STUN 端点与 UDP socket。',
188+
options: _AddressFamilyOption.values,
189+
value: addressFamily.value,
190+
onChanged: (_AddressFamilyOption value) {
191+
addressFamily.value = value;
192+
},
193+
),
164194
NumberFieldTile(
165195
icon: FluentIcons.plug_connected,
166196
title: '本地绑定端口 (Local Bind Port)',
@@ -465,3 +495,4 @@ String _formatLogEntry(StunLogEvent event) {
465495
final String level = event.level.name.toUpperCase();
466496
return '[$timestamp] [$level] ${event.format()}';
467497
}
498+

pubspec.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -641,11 +641,11 @@ packages:
641641
dependency: "direct main"
642642
description:
643643
path: "."
644-
ref: "^3.0.1"
645-
resolved-ref: a6bc04c674c0fb4c9aeb3e439bea6599891793d1
644+
ref: "3.0.2"
645+
resolved-ref: "6f2a54983151ea97f743445a96a08d460cbc90b1"
646646
url: "https://github.com/halifox/dart_stun"
647647
source: git
648-
version: "3.0.1"
648+
version: "3.0.2"
649649
term_glyph:
650650
dependency: transitive
651651
description:

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ dependencies:
4242
stun:
4343
git:
4444
url: https://github.com/halifox/dart_stun
45-
ref: ^3.0.1
45+
ref: 3.0.2
4646
dev_dependencies:
4747
flutter_test:
4848
sdk: flutter

test/value_formatters_test.dart

Lines changed: 0 additions & 123 deletions
This file was deleted.

0 commit comments

Comments
 (0)