Modern Windows and Linux DNS benchmarking utility built with C# 12, .NET 8, Avalonia, SukiUI, and MVVM.
# From repository root
New-Item -ItemType Directory -Path DNSHop -Force
cd DNSHop
dotnet new sln -n DNSHop
dotnet new avalonia.mvvm -n DNSHop.App -o src/DNSHop.App
dotnet sln DNSHop.sln add src/DNSHop.App/DNSHop.App.csproj
dotnet add src/DNSHop.App/DNSHop.App.csproj package SukiUI
dotnet add src/DNSHop.App/DNSHop.App.csproj package DnsClient
dotnet add src/DNSHop.App/DNSHop.App.csproj package CsvHelper
dotnet add src/DNSHop.App/DNSHop.App.csproj package Avalonia.Controls.DataGridScaffolded MVVM core:
src/DNSHop.App/ViewModels/MainWindowViewModel.cssrc/DNSHop.App/ViewModels/DnsServerResultViewModel.cssrc/DNSHop.App/Models/*.cssrc/DNSHop.App/Views/MainWindow.axaml
Core benchmarking service:
src/DNSHop.App/Services/DnsBenchmarkService.cs
Features implemented:
- Concurrent benchmarking with
Task.WhenAll+SemaphoreSlimconcurrency cap. - Cached probe:
google.com. - Uncached probe: randomized
Guid.com. - DotCom probe:
comNS. - Reliability probes:
- Redirecting/NXDOMAIN hijack check: randomized
.invalidquery. - DNSSEC validation check:
dnssec-failed.org(SERVFAIL expected for validating resolvers).
- Redirecting/NXDOMAIN hijack check: randomized
- Protocol support:
- Standard UDP/TCP DNS via
DnsClient.NET. - DoH via RFC 8484 wire-format POST.
- DoT via TLS-wrapped DNS with length-prefixed wire format.
- Standard UDP/TCP DNS via
Main shell:
src/DNSHop.App/Views/MainWindow.axamlusingSukiWindow.src/DNSHop.App/App.axamlwithSukiThemefor light/dark theme switching.
Views included:
- Introduction
- Nameservers (main DataGrid + context menu)
- Tabular Data
- Conclusions
UI features:
- Dashboard with queries remaining, completion %, elapsed time.
- Filterable/sortable nameserver list.
- Context-menu actions:
- Remove / Sideline / Pin to Top
- Remove Dead / Non-DNSSEC / Redirecting
- Copy IP
- Sort by Best / Cached / Uncached
- Custom response-time visual bars:
src/DNSHop.App/Controls/ResponseBarsControl.cs
Export services:
src/DNSHop.App/Services/ExportService.cs
Supported exports:
- CSV
- JSON
- PNG chart snapshot copied to clipboard
Packaging assets:
installer/DNSHop.isspublish-win-x64.ps1publish-linux-x64.shpublish-linux-appimage.sh
Release assets typically include:
DNS-Hop-Setup-vX.Y.exeWindows installerDNS-Hop-Portable-vX.Y.zipWindows portable buildDNS-Hop-AppImage-vX.Y-x86_64.AppImageLinux AppImage
dotnet publish src/DNSHop.App/DNSHop.App.csproj `
-c Release `
-r win-x64 `
--self-contained true `
/p:PublishSingleFile=true `
/p:PublishTrimmed=true `
/p:TrimMode=partial `
/p:IncludeNativeLibrariesForSelfExtract=true `
-o artifacts/publish-win-x64-releasedotnet publish src/DNSHop.App/DNSHop.App.csproj \
-c Release \
-r linux-x64 \
--self-contained true \
/p:PublishSingleFile=true \
/p:IncludeNativeLibrariesForSelfExtract=true \
-o artifacts/publish-linux-x64dotnet restore
dotnet build DNSHop.sln
dotnet run --project src/DNSHop.App/DNSHop.App.csproj- DNS Hop targets Windows and Linux desktop releases.
- System DNS switching on Linux supports classic UDP/TCP DNS endpoints with direct IP addresses.
- On standard Linux, DNS Hop first tries NetworkManager or
systemd-resolved; if neither is available it falls back to writing/etc/resolv.conf. - On WSL, DNS Hop writes
/etc/resolv.conf. For changes to survive a WSL restart,/etc/wsl.confneeds[network] generateResolvConf=false. - WSL testing requires WSLg for the GUI. The published
artifacts/publish-linux-x64/DNSHop.Appbinary is self-contained and does not require the .NET runtime inside WSL. publish-linux-appimage.shproducesartifacts/DNSHop-linux-x86_64.AppImage.- GitHub Actions now builds the AppImage on
ubuntu-22.04and smoke-tests the bundled binary on Debian 12, Fedora 41, and Arch usingDNSHop.App --smoke-test.
- On startup, the app can merge built-in resolvers with a public list feed.
- Export files are written to:
Documents\DNSHop\Exports.
