public static async Task <PingSession> StartAsync(PingRequestOptions options) { var cancellationTokenSource = new CancellationTokenSource(); Console.CancelKeyPress += (sender, e) => { e.Cancel = true; cancellationTokenSource.Cancel(); }; var pingRequestAgent = new PingRequestAgent(); pingRequestAgent.PingCompleted += (sender, e) => { var result = e.CompletedPing; if (result.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}: bytes={1} time={2}ms TTL={3} when={4:yyyy-MM-ddTHH:mm:ss}", result.Address.ToString(), result.BufferLength, result.RoundtripTime, result.TimeToLive, result.RequestTime); } else { Console.WriteLine(result.Status.ToString()); } }; Console.WriteLine(); Console.WriteLine("Pinging {0} with {1} bytes of data:", options.Address, options.BufferSize); var results = await pingRequestAgent.StartAsync(options, cancellationTokenSource.Token); if (results.PacketsSent > 0) { Console.WriteLine(); Console.WriteLine("Ping stats for {0}", options.Address); Console.WriteLine(" Packets: Sent = {0}, Received = {1}, Lost = {2} ({3:0}% loss),", results.PacketsSent, results.PacketsReceived, results.PacketsLost, results.PacketsLostPercentage); Console.WriteLine(" Time: Start = {0:yyyy-MM-ddTHH:mm:ss}, End = {1:yyyy-MM-ddTHH:mm:ss}, Elapsed = {2:0}s", results.StartTime, results.EndTime, results.Elapsed.TotalSeconds); if (results.PacketsReceived > 0) { Console.WriteLine("Approximate round trip times in milli-seconds:"); Console.WriteLine(" Minimum = {0}ms, Maximum = {1}ms, Average = {2:0}ms", results.MinimumRoundtrip, results.MaximumRoundtrip, results.AverageRoundtrip); } } Console.WriteLine(); return(results); }
public static async Task <PingSession> StartAsync(PingRequestOptions options) { var pingRequestAgent = new PingRequestAgent(); var cancellationTokenSource = new CancellationTokenSource(); Console.CancelKeyPress += (sender, e) => { e.Cancel = true; cancellationTokenSource.Cancel(); }; PingSession results = null; if (options.NumberOfPings != -1) { await AnsiConsole.Progress() .Columns(new ProgressColumn[] { new TaskDescriptionColumn(), new ProgressBarColumn(), new PercentageColumn(), new RemainingTimeColumn() }) .StartAsync(async ctx => { var requestsRemaining = ctx.AddTask($"Sending {options.NumberOfPings} pings to [yellow]{options.Address}[/]", new ProgressTaskSettings { MaxValue = options.NumberOfPings }); pingRequestAgent.PingCompleted += (sender, e) => { requestsRemaining.Increment(1); }; results = await pingRequestAgent.StartAsync(options, cancellationTokenSource.Token); }); } else { await AnsiConsole.Status() .Spinner(Spinner.Known.Dots8Bit) .StartAsync($"Pinging {options.Address}...", async ctx => { pingRequestAgent.PingCompleted += (sender, e) => { if (e.CompletedPing.Status != IPStatus.Success) { AnsiConsole.MarkupLine("[grey54]{0:yyyy-MM-ddTHH:mm:ss}: {1}[/]", e.CompletedPing.RequestTime, e.CompletedPing.Status); } var packetsLostColour = "grey54"; if (e.Session.PacketsLostPercentage > 5) { packetsLostColour = "red"; } else if (Math.Round(e.Session.PacketsLostPercentage, 2) > 0) { packetsLostColour = "maroon"; } ctx.Status($"Continuously pinging [yellow]{options.Address}[/] [grey54]({e.Session.PacketsSent} sent, [{packetsLostColour}]{e.Session.PacketsLostPercentage:0.00}% lost[/], {e.Session.AverageRoundtrip}ms average, {(int)e.Session.Elapsed.TotalMinutes}:{e.Session.Elapsed.Seconds:00} elapsed)[/]"); }; results = await pingRequestAgent.StartAsync(options, cancellationTokenSource.Token); }); } if (results != null && results.PacketsSent > 0) { AnsiConsole.WriteLine(); AnsiConsole.Render(new Rule($"[white]Ping results for [yellow]{options.Address}[/][/]").RuleStyle("grey54")); AnsiConsole.WriteLine(); var table = new Table() .Centered() .AddColumns( new TableColumn("Packets (Sent/Received/Lost)").Centered(), new TableColumn("Minimum Roundtrip").Centered(), new TableColumn("Maximum Roundtrip").Centered(), new TableColumn("Average Roundtrip").Centered(), new TableColumn("Elapsed Time").Centered() ) .SimpleBorder(); table.AddRow( $"{results.PacketsSent} / {results.PacketsReceived} / {results.PacketsLost}", results.MinimumRoundtrip.ToString("0ms"), results.MaximumRoundtrip.ToString("0ms"), results.AverageRoundtrip.ToString("0ms"), $"{(int)results.Elapsed.TotalMinutes}:{results.Elapsed.Seconds:00}" ); AnsiConsole.Render(table); } else { AnsiConsole.WriteLine("No results available."); } AnsiConsole.WriteLine(); return(results); }