Exemple #1
0
        private bool DestinationReached(byte[] receivedMessage, long responseTime)
        {
            int responceType = IcmpTools.GetIcmpType(receivedMessage);

            if (responceType == 0)
            {
                Write("{0, 10}", responseTime + " мс");
                return(true);
            }
            if (responceType == 11)
            {
                Write("{0, 10}", responseTime + " мс");
            }
            return(false);
        }
Exemple #2
0
        public void Start(string host, bool needToViewDns)
        {
            IPHostEntry ipHost;

            try
            {
                ipHost = Dns.GetHostEntry(host);
            }
            catch (SocketException)
            {
                WriteLine("Не удается разрешить системное имя узла " + host);
                return;
            }
            catch (Exception)
            {
                WriteLine("Длина разрешаемого имени узла или IP-адреса превышает 255 символов.");
                return;
            }

            IPEndPoint ipEndPoint = new IPEndPoint(ipHost.AddressList[0], PORT_NUM);
            EndPoint   endPoint   = ipEndPoint;
            Socket     socket     = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, RECEIVE_TIMEOUT);
            bool isEndPointReached = false;

            byte[] data = IcmpTools.GetEchoIcmpPackage();
            byte[] receivedData;
            int    ttl = 1;

            WriteLine("Трассировка маршрута к " + host);
            WriteLine("с максимальным количеством прыжков " + MAXIMUM_JUMPS + ":");
            WriteLine();
            for (int i = 0; i < MAXIMUM_JUMPS; i++)
            {
                int errorCount = 0;
                Write("{0, 2}", i + 1);
                socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, ttl++);
                Stopwatch track = new Stopwatch();
                receivedData = new byte[256];
                for (int j = 0; j < PACKET_COUNT; j++)
                {
                    try
                    {
                        track.Reset();
                        track.Start();
                        socket.SendTo(data, data.Length, SocketFlags.None, ipEndPoint);
                        socket.ReceiveFrom(receivedData, ref endPoint);
                        track.Stop();
                        long responseTime = track.ElapsedMilliseconds;
                        isEndPointReached = DestinationReached(receivedData, responseTime);
                    }
                    catch (SocketException)
                    {
                        Write("{0, 10}", "*");
                        errorCount++;
                    }
                }
                if (errorCount == PACKET_COUNT)
                {
                    Write("  Превышен интервал ожидания для запроса.\n");
                }
                else if (needToViewDns)
                {
                    ViewDns(endPoint);
                }
                else
                {
                    string str_endPoint = $"{endPoint}";
                    str_endPoint = str_endPoint.Replace(":0", " ");
                    Write("    {0}\n", str_endPoint);
                }
                if (isEndPointReached)
                {
                    WriteLine("\nТрассировка завершена.");
                    break;
                }
            }
        }