|
Новичок
Регистрация: 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();
}
}
|