c# отправить icmp ответ на эхо запрос

Мне нужно отправить кастомный ответ на icmp echo request от клиента. Сервер написан на c#, он получает эхо-запрос и отправляет автоматический эхо-ответ клиенту. Код сервера:

    static void Main(string[] args)
    {
        IPAddress ipAddr = IPAddress.Parse(args[0]);
        IPEndPoint ipMyEndPoint = new IPEndPoint(ipAddr, 0);
        EndPoint myEndPoint = (ipMyEndPoint);
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
        socket.Bind(myEndPoint);
        socket.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(1), null);
        while (true)
        {
            Byte[] ReceiveBuffer = new Byte[socket.ReceiveBufferSize];
            var nBytes = socket.ReceiveFrom(ReceiveBuffer, ReceiveBuffer.Length, SocketFlags.None, ref myEndPoint);
            var icmpType = ReceiveBuffer[ICMP_TYPE_OFFSET];
            if (icmpType == ICMP_TYPE_ECHO_REQUEST)
            {
                Console.WriteLine("Echo Request received from " + myEndPoint);
                Console.WriteLine("Received: {0} bytes", nBytes);
                if (nBytes > PAYLOAD_OFFSET)
                {
                    var payLoadSize = nBytes - PAYLOAD_OFFSET;
                    byte[] payLoad = new byte[payLoadSize];
                    Array.Copy(ReceiveBuffer, PAYLOAD_OFFSET, payLoad, 0, payLoadSize);
                    string msg = Encoding.ASCII.GetString(payLoad);
                    Console.WriteLine("Data hex: {0}", BitConverter.ToString(payLoad));
                    Console.WriteLine("Data text: {0}", msg);
                }
                Console.WriteLine("---------------");
                IPEndPoint ip = myEndPoint as IPEndPoint;
                Console.WriteLine("Sending request to remote " + ip.Address);
                byte[] payload = Encoding.ASCII.GetBytes("nice job, man!");
                socket.SendTo(BuildIcmpMessage(payload, payload.Length), myEndPoint);
                break;
                /*Ping pingSender = new Ping();
                PingOptions options = new PingOptions();

                // Use the default Ttl value which is 128,
                // but change the fragmentation behavior.
                options.DontFragment = true;

                // Create a buffer of 32 bytes of data to be transmitted.
                string data = "Nice job, man";
                byte[] buffer = Encoding.ASCII.GetBytes(data);

                int timeout = 120;
                IPEndPoint ip = myEndPoint as IPEndPoint;
                Console.WriteLine("Sending request to remote " + ip.Address);
                PingReply reply = pingSender.Send(ip.Address, timeout, buffer, options);
                Console.WriteLine(reply.Status);
                break;*/

            }
        }
    }

Когда я пытаюсь отправить сообщение по тому же сокету с сервера, оно уходит клиенту (по логам wireshark), но до клиента не доходит (по тем же логам wireshark на клиенте). Если пытаться отправить с сервера ответный пинг на клиент (закомментированная часть кода), то запрос отбивается по тайм-ауту. Я так понял, что на тип ICMP пакета ECHO REQUEST ОС автоматически отправляет ECHO REPLY, вопрос в том, как самому генерировать ответ?


Ответы (0 шт):