private void ProcessTraceroute(String targetNameOrAddress) { String resolvedTargetName = null; IPAddress targetAddress = null; byte[] buffer = GetSendBuffer(BufferSize); if (!InitProcessPing(targetNameOrAddress, out resolvedTargetName, out targetAddress)) { return; } WriteConsoleTraceRouteHeader(resolvedTargetName, targetAddress.ToString()); TraceRouteResult traceRouteResult = new TraceRouteResult(Source, targetAddress, resolvedTargetName); Int32 currentHop = 1; Ping sender = new Ping(); PingOptions pingOptions = new PingOptions(currentHop, DontFragment.IsPresent); PingReply reply = null; Int32 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 System.Net.NetworkInformation.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); } }