Network Utility Kit 是我开发的一款网络工具套件,集成了多种常用的网络诊断和查询功能。本文将深入探讨这个项目的架构设计、技术实现以及开发过程中的思考和决策。
项目背景
在日常工作和学习中,我经常需要使用各种网络工具来诊断和调试网络问题。这些工具通常分散在不同的命令行工具或在线服务中,使用起来不够方便。我想打造一个统一、易用的网络工具套件,将这些功能集成到一个应用中。
功能规划
经过调研和需求分析,我确定了以下核心功能:
- Ping - 检测网络连通性
- Traceroute - 追踪网络路径
- NSLookup - DNS 查询
- Whois - 域名信息查询
- Port Scanner - 端口扫描
- Speed Test - 网络速度测试
- IP Calculator - IP 地址计算器
架构设计
采用了分层架构设计:
1. 表示层
使用 WinUI 3 构建用户界面,采用 MVVM 模式:
Views- 包含各种工具的视图页面ViewModels- 业务逻辑和状态管理Models- 数据模型
2. 服务层
封装各种网络功能的服务类:
public interface INetworkService
{
Task<PingResult> PingAsync(string host, int count = 4);
Task<TracerouteResult> TracerouteAsync(string host);
Task<DnsQueryResult> NsLookupAsync(string domain);
// ... 其他方法
}
3. 核心层
实现各种网络功能的核心逻辑:
PingService- ICMP Ping 实现TracerouteService- 路由追踪实现DnsService- DNS 查询实现PortScannerService- 端口扫描实现
关键技术实现
Ping 功能实现
使用 .NET 的 Ping 类实现:
public async Task<PingResult> PingAsync(string host, int count = 4)
{
var ping = new Ping();
var replies = new List<PingReply>
for (int i = 0; i < count; i++)
{
try
{
var reply = await ping.SendPingAsync(host, 5000);
replies.Add(reply);
}
catch (PingException ex)
{
// 处理异常
}
}
return new PingResult(replies);
}
Traceroute 实现
通过发送 TTL 递增的 ICMP 包实现路由追踪:
public async Task<TracerouteResult> TracerouteAsync(string host)
{
var hops = new List<HopInfo>();
const int maxHops = 30;
for (int ttl = 1; ttl <= maxHops; ttl++)
{
var ping = new Ping();
var options = new PingOptions(ttl, true);
try
{
var reply = await ping.SendPingAsync(host, 5000, new byte[32], options);
hops.Add(new HopInfo(ttl, reply.Address, reply.RoundtripTime));
if (reply.Status == IPStatus.Success)
break;
}
catch (PingException)
{
hops.Add(new HopInfo(ttl, null, -1));
}
}
return new TracerouteResult(hops);
}
DNS 查询实现
使用 Dns 类进行 DNS 查询:
public async Task<DnsQueryResult> NsLookupAsync(string domain)
{
try
{
var hostEntry = await Dns.GetHostEntryAsync(domain);
var addresses = hostEntry.AddressList.Select(ip => ip.ToString()).ToList();
return new DnsQueryResult(domain, addresses);
}
catch (SocketException ex)
{
throw new DnsException("DNS查询失败", ex);
}
}
端口扫描实现
使用 TcpClient 进行端口扫描:
public async Task<PortScanResult> ScanPortsAsync(string host, int startPort, int endPort)
{
var openPorts = new List<int>();
var tasks = new List<Task>();
for (int port = startPort; port <= endPort; port++)
{
tasks.Add(Task.Run(async () =>
{
using var client = new TcpClient();
try
{
await client.ConnectAsync(host, port, 100);
lock (openPorts)
{
openPorts.Add(port);
}
}
catch
{
// 端口关闭
}
}));
}
await Task.WhenAll(tasks);
return new PortScanResult(host, openPorts);
}
UI/UX 设计
在设计 UI 时,我注重以下几点:
1. 统一的界面风格
所有工具都采用一致的设计语言,包括配色、字体、布局等。
2. 清晰的结果展示
使用表格、图表等多种方式展示结果,便于用户理解。
3. 实时反馈
对于长时间运行的操作,提供进度指示和取消功能。
4. 历史记录
保存用户的查询历史,方便重复使用。
性能优化
1. 异步操作
所有网络操作都使用 async/await,避免阻塞 UI 线程。
2. 并发控制
使用 SemaphoreSlim 控制并发数量,避免过度消耗资源。
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(10);
public async Task<PortScanResult> ScanPortsAsync(...)
{
var tasks = new List<Task>();
for (int port = startPort; port <= endPort; port++)
{
tasks.Add(ScanPortAsync(host, port));
}
await Task.WhenAll(tasks);
// ...
}
private async Task ScanPortAsync(string host, int port)
{
await _semaphore.WaitAsync();
try
{
// 扫描端口
}
finally
{
_semaphore.Release();
}
}
3. 结果缓存
对于 DNS 查询等结果,实现缓存机制。
测试与质量保证
- 单元测试:对核心逻辑进行单元测试
- 集成测试:测试各种网络功能
- 性能测试:测试大规模扫描的性能
- 兼容性测试:在不同网络环境下测试
遇到的挑战
1. 跨平台网络访问
Windows UWP 环境下网络访问有一定限制,需要正确配置网络能力。
2. 端口扫描性能
大量端口扫描时需要注意性能优化和资源管理。
3. 结果解析
不同网络工具返回的结果格式各异,需要统一处理。
未来计划
- 添加更多网络工具(如 Netstat、Route 等)
- 支持自定义命令组合
- 添加网络监控功能
- 支持结果导出和报告生成
总结
开发 Network Utility Kit 是一个充满挑战但也很有成就感的过程。通过这个项目,我深入学习了网络编程、异步编程、UI 设计等多个领域的知识。希望这款工具能够帮助更多的开发者和网络管理员提高工作效率。