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, вопрос в том, как самому генерировать ответ?