Показать сообщение отдельно

  #168  
Старый 20.06.2009, 08:55
caban
Новичок
Регистрация: 20.09.2008
Сообщений: 1
С нами: 9283383

Репутация: 0
По умолчанию

Народ, есть проблема пишу на C# программу которая отправляет, ICMP Redirect Host сообещние, делаю машину шлюзом, отправляю с неё сообщение на узел, ноль рекации, маршрут не меняется, и arp запросы к новому шлюзу тоже не идут, хотя снифер, говорит что сообщение отправленно, может я что-то в протоколе не понимаю, но rfc прочитал.
в чем трабл?
Код:
       public class my_icmp
        {
            public byte Type;
            public byte Code;
            public UInt16 Checksum;
         //   public byte[]  gateway = new byte[4];
            public int MessageSize;
            public byte[] Message = new byte[1024];
            public my_icmp()
            {
            }

            public my_icmp(byte[] data, int size)
            {
                Type = data[20];
                Code = data[21];
                Checksum = BitConverter.ToUInt16(data, 22);
                MessageSize = size - 24;
                Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
            }
            public byte[] getBytes()
            {
                byte[] data = new byte[MessageSize + 9];
                Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
                Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
                return data;
            }
            public UInt16 getChecksum()
            {
                UInt32 chcksm = 0;
                byte[] data = getBytes();
                int packetsize = MessageSize + 8;
                int index = 0;
                while (index < packetsize)
                {
                    chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
                    index += 2;
                }
                chcksm = (chcksm >> 16) + (chcksm & 0xffff);
                chcksm += (chcksm >> 16);
                return (UInt16)(~chcksm);
            }

        }


        private void main_button_Click(object sender, EventArgs e)
        {
            byte[] data = new byte[1024];
            int recv;
            Socket icmp_mess = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IP_txtbox.Text), 0);
            EndPoint ep = (EndPoint)iep;
            my_icmp packet = new my_icmp();
            packet.Type = 0x05;
            packet.Code = 0x01;
            packet.Checksum = 0;
           /* packet.gateway[0] = 0x0A;
            packet.gateway[1] = 0x0A;
            packet.gateway[2] = 0x10;
            packet.gateway[3] = 0x97;*/

            Buffer.BlockCopy(
            BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2);
            Buffer.BlockCopy(
            BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2);
            data = Encoding.ASCII.GetBytes(Data_TxtBox.Text);
            Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);

            packet.Message[0] = 0x0A;
            packet.Message[1] = 0x0A;
            packet.Message[2] = 0x10;
            packet.Message[3] = 0x99;

            packet.MessageSize = data.Length + 4;
            int packetsize = packet.MessageSize +4;
            UInt16 chcksum = packet.getChecksum();
            packet.Checksum = chcksum;

            icmp_mess.SetSocketOption(SocketOptionLevel.Socket,
              SocketOptionName.ReceiveTimeout, 3000);
            icmp_mess.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);
            //icmp_mess.
            try
            {
                data = new byte[1024];
                recv = icmp_mess.ReceiveFrom(data, ref ep);
            }
            catch (SocketException)
            {
               // Console.WriteLine("No response from remote host");

                Output_edit.Text += "No response from remote host";

                return;
            }

            my_icmp  response = new my_icmp(data, recv);
            Output_edit.Text += ep.ToString();
            Output_edit.Text += response.Type;
            Output_edit.Text += response.Code;
            
            int Identifier = BitConverter.ToInt16(response.Message, 0);
            int Sequence = BitConverter.ToInt16(response.Message, 2);


            Output_edit.Text += Identifier;
            Output_edit.Text += Sequence;

            
            string stringData = Encoding.ASCII.GetString(response.Message,
             4, response.MessageSize - 4);
            Output_edit.Text += stringData;
            

            icmp_mess.Close();

        }
    }
 
Ответить с цитированием