using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Traceroute
{
    public static void Main(string[] args)
    {
        // Целевой адрес ("google.com", либо ваш домен)
        string targetHost = args.Length > 0 ? args[0] : "yandex.ru";
        int maxHops = 30;  // Максимальное число хопов (точек маршрута)
        int timeout = 3000; // Тайм-аут на ожидание ответа в миллисекундах
        int dataSize = 32;  // Размер данных (байт), отправляемых через ICMP

        Console.WriteLine($"Tracing route to {targetHost} with a maximum of {maxHops} hops:");

        try
        {
            // Определяем IP-адрес для целевого хоста
            IPAddress targetAddress = Dns.GetHostEntry(targetHost).AddressList[0];

            // Создаем сырой сокет для работы с ICMP
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp))
            {
                socket.ReceiveTimeout = timeout;

                // Начинаем отправку ICMP пакетов с увеличением TTL
                for (int ttl = 1; ttl <= maxHops; ttl++)
                {
                    // Устанавливаем текущее значение TTL
                    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, ttl);

                    // Генерируем ICMP Echo Request (ICMP 8)
                    byte[] icmpPacket = CreateIcmpEchoRequest(dataSize);

                    // Адрес назначения
                    EndPoint targetEndPoint = new IPEndPoint(targetAddress, 0);

                    // Время отправки
                    DateTime sendTime = DateTime.Now;
                    socket.SendTo(icmpPacket, targetEndPoint);

                    // Буфер для получения ответа и ожидаем ICMP ответ
                    byte[] receiveBuffer = new byte[1024];
                    try
                    {
                        EndPoint responseEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        socket.ReceiveFrom(receiveBuffer, ref responseEndPoint);

                        // Разбираем ICMP ответ
                        int icmpType = receiveBuffer[20]; // Тип ICMP сообщения
                        int icmpCode = receiveBuffer[21]; // Код ICMP

                        double roundTripTime = (DateTime.Now - sendTime).TotalMilliseconds;

                        Console.Write($"{ttl}\t{responseEndPoint} - {roundTripTime:F3} ms\t");

                        if (icmpType == 11 && icmpCode == 0)
                        {
                            // ICMP Time Exceeded - промежуточное устройство
                            Console.WriteLine("(intermediate hop)");
                        }
                        else if (icmpType == 0)
                        {
                            // ICMP Echo Reply - достигли назначения
                            Console.WriteLine("(destination reached)");
                            break; // Завершаем выполнение как только цель достигнута
                        }
                        else
                        {
                            // Непредвиденный тип ICMP
                            Console.WriteLine("(unexpected response type)");
                        }
                    }
                    catch (SocketException)
                    {
                        // Если на текущем TTL происходит тайм-аут
                        Console.WriteLine($"{ttl}\tRequest timed out.");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }

    // Метод создаёт ICMP Echo Request (тип 8)
    static byte[] CreateIcmpEchoRequest(int dataSize)
    {
        int packetSize = 8 + dataSize; // 8 байт заголовок + полезные данные
        byte[] icmpPacket = new byte[packetSize];

        // Заполняем заголовок ICMP
        icmpPacket[0] = 8; // Тип Echo Request
        icmpPacket[1] = 0; // Код = 0
        icmpPacket[2] = 0; // Контрольная сумма (будет подсчитана)
        icmpPacket[3] = 0;
        icmpPacket[4] = 0; // ID
        icmpPacket[5] = 1; // ID
        icmpPacket[6] = 0; // Секвенц-номер
        icmpPacket[7] = 1; // Sequence Number

        // Полезная нагрузка ICMP
        for (int i = 8; i < dataSize + 8; i++)
        {
            icmpPacket[i] = (byte)(i & 0xFF);
        }

        // Расчет контрольной суммы ICMP
        ushort checksum = CalculateChecksum(icmpPacket);
        icmpPacket[2] = (byte)(checksum >> 8);  // Старший байт
        icmpPacket[3] = (byte)(checksum & 0xFF); // Младший байт

        return icmpPacket;
    }

    // Метод вычисляет контрольную сумму ICMP
    static ushort CalculateChecksum(byte[] data)
    {
        int checksum = 0;

        for (int i = 0; i < data.Length; i += 2)
        {
            ushort word = (ushort)((data[i] << 8) | (i + 1 < data.Length ? data[i + 1] : 0));
            checksum += word;
        }

        // Складываем перенесённые значения
        while ((checksum >> 16) > 0)
        {
            checksum = (checksum & 0xFFFF) + (checksum >> 16);
        }

        // Возвращаем инвертированное значение (по стандарту ICMP)
        return (ushort)~checksum;
    }
}



➜  TRACERT sudo dotnet run
Tracing route to yandex.ru with a maximum of 30 hops:
Error: Socket is not connected
➜  TRACERT 


помоги исправь сделай чтобы было круто и все заработало\