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); } }