public void UpdateStatistics(SessionPanel sessionPanel, PingSession pingSession) { sessionPanel.HostLabel.Text = pingSession.Host; sessionPanel.TitleLabel.Text = pingSession.Title; sessionPanel.PacketLossLabel.Text = pingSession.PacketLostPercent.ToString() + "%"; if (pingSession.PacketLostPercent < 100) { ICMPReply lastReply = pingSession.ReplyQueue.Last(); if (lastReply.Status == System.Net.NetworkInformation.IPStatus.Success) { sessionPanel.LastDelayLabel.Text = lastReply.RoundtripTime.ToString() + "ms"; } else { sessionPanel.LastDelayLabel.Text = lastReply.Status.ToString(); } sessionPanel.AvgLabel.Text = pingSession.AverageLatency.ToString() + " ms"; sessionPanel.MaxLabel.Text = pingSession.MaxLatency.ToString() + " ms"; sessionPanel.MinLabel.Text = pingSession.MinLatency.ToString() + " ms"; sessionPanel.JitterLabel.Text = pingSession.Jitter.ToString() + " ms"; } else { sessionPanel.LastDelayLabel.Text = pingSession.ReplyQueue.Last().Status.ToString(); sessionPanel.AvgLabel.Text = "N/A"; sessionPanel.MaxLabel.Text = "N/A"; sessionPanel.MinLabel.Text = "N/A"; sessionPanel.JitterLabel.Text = "N/A"; } }
private void UpdateLatencyChart(SessionPanel sessionPanel, PingSession pingSession) { sessionPanel.LatencyChart.Series.Clear(); var series = new Series(); series.Name = "latency"; series.ChartType = SeriesChartType.Area; var chartArea = new ChartArea(); chartArea.AxisX.LabelStyle.Enabled = false; List <int> xvals = new List <int>(); List <long> yvals = new List <long>(); int i = 0; foreach (ICMPReply reply in pingSession.ReplyQueue) { xvals.Add(i); i++; yvals.Add(reply.RoundtripTime); } sessionPanel.LatencyChart.Series.Add(series); sessionPanel.LatencyChart.Series["latency"].Points.DataBindXY(xvals, yvals); sessionPanel.LatencyChart.Invalidate(); }
public void UpdateSessionPanel(SessionPanel sessionPanel, PingSession pingSession) { if (InvokeRequired) { this.BeginInvoke(new UpdateSessionPanelDelegate(UpdateSessionPanel), sessionPanel, pingSession); } else { UpdateStatistics(sessionPanel, pingSession); UpdateLatencyChart(sessionPanel, pingSession); } }
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); }