Exemple #1
0
        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);
            }
        }