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);
        }
Example #2
0
        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);
        }