A .NET client library for LibreSpeed speed test servers.
Measure download speed, upload speed, ping, and jitter against self-hosted or public LibreSpeed servers.
Installation
dotnet add package LibreSpeed.NET
Quick Start
One-liner with public servers
using LibreSpeed.NET; using var client = new LibreSpeedClient(); var result = await client.RunWithBestServerAsync(); Console.WriteLine($"Server: {result.Server.Name}"); Console.WriteLine($"Ping: {result.Latency:F2} ms (jitter: {result.Jitter:F2} ms)"); Console.WriteLine($"Download: {result.DownloadSpeed:F2} Mbps"); Console.WriteLine($"Upload: {result.UploadSpeed:F2} Mbps");
Custom/self-hosted server
using LibreSpeed.NET; var server = new Server { Name = "My Server", BaseUrl = "https://speedtest.example.com/backend/" }; using var client = new LibreSpeedClient(); var result = await client.RunAsync(server); Console.WriteLine(result); // Ping: 12.34ms (+/-1.23ms) | Download: 95.67 Mbps | Upload: 45.23 Mbps
Multiple servers with automatic selection
using LibreSpeed.NET; var servers = new List<Server> { new Server { Name = "Frankfurt", BaseUrl = "https://fra.speedtest.clouvider.net/backend/" }, new Server { Name = "Amsterdam", BaseUrl = "https://ams.speedtest.clouvider.net/backend/" }, new Server { Name = "London", BaseUrl = "https://lon.speedtest.clouvider.net/backend/" } }; using var client = new LibreSpeedClient(); var bestServer = await client.GetBestServerAsync(servers); Console.WriteLine($"Best server: {bestServer.Name} ({bestServer.Latency:F0}ms)"); var result = await client.RunAsync(bestServer);
Fetch public server list
using LibreSpeed.NET; // Fetch all public servers from librespeed.org var servers = await ServerList.FetchPublicServersAsync(); foreach (var server in servers.Take(5)) { Console.WriteLine($"{server.Name}: {server.BaseUrl}"); }
Configuration
var client = new LibreSpeedClient { ParallelStreams = 4, // Number of concurrent connections (default: 3) DownloadDuration = 10, // Download test duration in seconds (default: 15) UploadDuration = 10, // Upload test duration in seconds (default: 15) PingCount = 5, // Number of ping samples (default: 10) DownloadChunkSize = 100, // Chunk size in MB (default: 100) UploadChunkSize = 1024 * 1024 // Upload chunk size in bytes (default: 1MB) };
Progress Reporting
var client = new LibreSpeedClient { OnDownloadProgress = progress => Console.WriteLine($"Download: {progress:P0}"), OnUploadProgress = progress => Console.WriteLine($"Upload: {progress:P0}") };
Individual Tests
using var client = new LibreSpeedClient(); // Ping only var (latency, jitter) = await client.TestPingAsync(server); // Download only var (downloadSpeed, bytesDownloaded) = await client.TestDownloadAsync(server); // Upload only var (uploadSpeed, bytesUploaded) = await client.TestUploadAsync(server); // Get client IP var ip = await client.GetClientIpAsync(server);
Cancellation Support
All async methods support cancellation:
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); var result = await client.RunAsync(server, cts.Token);
Custom HttpClient
For advanced scenarios (proxies, custom handlers, etc.):
var httpClient = new HttpClient(new HttpClientHandler { Proxy = new WebProxy("http://proxy:8080") }); using var client = new LibreSpeedClient(httpClient);
License
MIT