Пример #1
0
        private void RunTest(object state)
        {
            lock (testLock)
            {
                try
                {
                    PrintTestStatus(true);
                    SpeedTest        speedTest        = new SpeedTest();
                    SpeedTestResult  speedTestResult  = speedTest.Run(speedTestServerId);
                    TraceRoute       traceRoute       = new TraceRoute();
                    TraceRouteResult traceRouteResult = traceRoute.Run(speedTestResult.Server.Ip);


                    results.Add(new DiagnosticResult
                    {
                        SpeedTestResult  = speedTestResult,
                        TraceRouteResult = traceRouteResult
                    });

                    WriteResults();
                    PrintTestStatus();
                }
                catch (Exception e)
                {
                    Console.WriteLine($"[{DateTime.Now:MM-dd hh:mm:ss}] Exception encountered running test: {e}");
                }
            }
        }
        private void ProcessTraceroute(string targetNameOrAddress)
        {
            byte[] buffer = GetSendBuffer(BufferSize);

            string    resolvedTargetName;
            IPAddress targetAddress;

            if (!InitProcessPing(targetNameOrAddress, out resolvedTargetName, out targetAddress))
            {
                return;
            }

            WriteConsoleTraceRouteHeader(resolvedTargetName, targetAddress.ToString());

            TraceRouteResult traceRouteResult = new TraceRouteResult(Source, targetAddress, resolvedTargetName);

            int         currentHop  = 1;
            Ping        sender      = new Ping();
            PingOptions pingOptions = new PingOptions(currentHop, DontFragment.IsPresent);
            PingReply   reply       = null;
            int         timeout     = TimeoutSeconds * 1000;

            do
            {
                TraceRouteReply traceRouteReply = new TraceRouteReply();

                pingOptions.Ttl = traceRouteReply.Hop = currentHop;
                currentHop++;

                // In the specific case we don't use 'Count' property.
                // If we change 'DefaultTraceRoutePingCount' we should change 'ConsoleTraceRouteReply' resource string.
                for (int i = 1; i <= DefaultTraceRoutePingCount; i++)
                {
                    try
                    {
                        reply = sender.Send(targetAddress, timeout, buffer, pingOptions);

                        traceRouteReply.PingReplies.Add(reply);
                    }
                    catch (PingException ex)
                    {
                        string message = StringUtil.Format(
                            TestConnectionResources.NoPingResult,
                            resolvedTargetName,
                            ex.Message);
                        Exception   pingException = new PingException(message, ex.InnerException);
                        ErrorRecord errorRecord   = new ErrorRecord(
                            pingException,
                            TestConnectionExceptionId,
                            ErrorCategory.ResourceUnavailable,
                            resolvedTargetName);
                        WriteError(errorRecord);

                        continue;
                    }
                    catch
                    {
                        // Ignore host resolve exceptions.
                    }

                    // We use short delay because it is impossible DoS with trace route.
                    Thread.Sleep(200);
                }

                if (ResolveDestination && reply.Status == IPStatus.Success)
                {
                    traceRouteReply.ReplyRouterName = Dns.GetHostEntry(reply.Address).HostName;
                }

                traceRouteReply.ReplyRouterAddress = reply.Address;

                WriteTraceRouteProgress(traceRouteReply);

                traceRouteResult.Replies.Add(traceRouteReply);
            } while (reply != null &&
                     currentHop <= sMaxHops &&
                     (reply.Status == IPStatus.TtlExpired || reply.Status == IPStatus.TimedOut));

            WriteTraceRouteFooter();

            if (Quiet.IsPresent)
            {
                WriteObject(currentHop <= sMaxHops);
            }
            else
            {
                WriteObject(traceRouteResult);
            }
        }