Exemplo n.º 1
0
        public void TraceAsync(IPAddress ipAddress, TracerouteOptions traceOptions, CancellationToken cancellationToken)
        {
            Task.Run(() =>
            {
                var buffer = new byte[traceOptions.Buffer];

                for (var i = 1; i < traceOptions.MaximumHops + 1; i++)
                {
                    var tasks = new List <Task <Tuple <PingReply, long> > >();

                    for (var y = 0; y < 3; y++)
                    {
                        var i1 = i;

                        tasks.Add(Task.Run(() =>
                        {
                            var stopwatch = new Stopwatch();

                            PingReply pingReply;

                            using (var ping = new System.Net.NetworkInformation.Ping())
                            {
                                stopwatch.Start();

                                pingReply = ping.Send(ipAddress, traceOptions.Timeout, buffer, new System.Net.NetworkInformation.PingOptions {
                                    Ttl = i1, DontFragment = traceOptions.DontFragement
                                });

                                stopwatch.Stop();
                            }

                            return(Tuple.Create(pingReply, stopwatch.ElapsedMilliseconds));
                        }, cancellationToken));
                    }

                    // ReSharper disable once CoVariantArrayConversion, no write operation
                    Task.WaitAll(tasks.ToArray());

                    var ipAddressHop = tasks.FirstOrDefault(x => x.Result.Item1 != null)?.Result.Item1.Address;

                    var hostname = string.Empty;

                    try
                    {
                        if (traceOptions.ResolveHostname && ipAddressHop != null)
                        {
                            hostname = Dns.GetHostEntry(ipAddressHop).HostName;
                        }
                    }
                    catch (SocketException) { } // Couldn't resolve hostname

                    OnHopReceived(new TracerouteHopReceivedArgs(i, tasks[0].Result.Item2, tasks[1].Result.Item2, tasks[2].Result.Item2, ipAddressHop, hostname, tasks[0].Result.Item1.Status, tasks[1].Result.Item1.Status, tasks[2].Result.Item1.Status));

                    // Check if finished
                    if (ipAddressHop != null && ipAddress.ToString() == ipAddressHop.ToString())
                    {
                        OnTraceComplete();
                        return;
                    }

                    // Check for cancel
                    if (cancellationToken.IsCancellationRequested)
                    {
                        OnUserHasCanceled();
                        return;
                    }
                }

                // Max hops reached...
                OnMaximumHopsReached(new MaximumHopsReachedArgs(traceOptions.MaximumHops));
            }, cancellationToken);
        }
Exemplo n.º 2
0
        public void TraceAsync(IPAddress ipAddress, TracerouteOptions traceOptions, CancellationToken cancellationToken)
        {
            Task.Run(() =>
            {
                byte[] buffer   = new byte[traceOptions.Buffer];
                int maximumHops = traceOptions.MaximumHops + 1;

                int hop = 1;

                do
                {
                    List <Task <Tuple <PingReply, long> > > tasks = new List <Task <Tuple <PingReply, long> > >();

                    for (int i = 0; i < 3; i++)
                    {
                        tasks.Add(Task.Run(() =>
                        {
                            Stopwatch stopwatch = new Stopwatch();

                            PingReply pingReply;

                            using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping())
                            {
                                stopwatch.Start();

                                pingReply = ping.Send(ipAddress, traceOptions.Timeout, buffer, new System.Net.NetworkInformation.PingOptions()
                                {
                                    Ttl = hop, DontFragment = traceOptions.DontFragement
                                });

                                stopwatch.Stop();
                            }

                            return(Tuple.Create(pingReply, stopwatch.ElapsedMilliseconds));
                        }));
                    }

                    Task.WaitAll(tasks.ToArray());

                    IPAddress ipAddressHop = tasks.FirstOrDefault(x => x.Result.Item1 != null).Result.Item1.Address;

                    string hostname = string.Empty;

                    try
                    {
                        if (ipAddressHop != null)
                        {
                            hostname = Dns.GetHostEntry(ipAddressHop).HostName;
                        }
                    }
                    catch (SocketException) { } // Couldn't resolve hostname

                    OnHopReceived(new TracerouteHopReceivedArgs(hop, tasks[0].Result.Item2, tasks[1].Result.Item2, tasks[2].Result.Item2, ipAddressHop, hostname, tasks[0].Result.Item1.Status, tasks[1].Result.Item1.Status, tasks[2].Result.Item1.Status));

                    if (ipAddressHop != null)
                    {
                        if (ipAddressHop.ToString() == ipAddress.ToString())
                        {
                            OnTraceComplete();
                            return;
                        }
                    }

                    hop++;
                } while (hop < maximumHops && !cancellationToken.IsCancellationRequested);

                if (cancellationToken.IsCancellationRequested)
                {
                    OnUserHasCanceled();
                }
                else if (hop == maximumHops)
                {
                    OnMaximumHopsReached(new MaximumHopsReachedArgs(traceOptions.MaximumHops));
                }
            }, cancellationToken);
        }