Я собрал ICMP-клиент и прослушиватель ICMP. Я могу отправлять пользовательские эхо-запросы слушателю, и слушатель распаковывает их правильно. Теперь я хотел бы, чтобы слушатель ответил - не с точным эхом, а с другим набором данных. Это то, что я пытался до сих пор:Отправка пользовательского ответа эхо-ответа ICMP
ICMP-клиент:
static void Main(string[] args)
{
Ping icmpClient = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
byte[] msg = Encoding.UTF8.GetBytes("howdy pilgrim");
while (true)
{
PingReply reply = icmpClient.Send("192.168.0.3", 60 * 1000, msg, options);
string responseReceived = Encoding.UTF8.GetString(reply.Buffer);
Console.WriteLine(DateTime.Now.ToString() + " Response from server: " + responseReceived);
Thread.Sleep(500);
}
}
ICMP слушателю:
static void Main(string[] args)
{
while (true)
{
Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
icmpListener.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.3"), 0));
icmpListener.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, null);
byte[] buffer = new byte[1024*1024];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
string receivedMsg = Encoding.UTF8.GetString(buffer, 28, bytesRead);
Console.WriteLine(DateTime.Now.ToString() + ": Received " + bytesRead + "B from " + remoteEndPoint + ": " + receivedMsg);
byte[] customResponse = Encoding.UTF8.GetBytes("good day");
int bytesSent = icmpListener.SendTo(customResponse, remoteEndPoint);
}
}
Это то, что на слушателя появляется:
Это то, что на клиенте появляется:
Таким образом, несмотря на отправку «хороший день» обратно клиенту, кажется, все еще получать «здор`ово паломник». Как я могу вернуть «хороший день» клиенту?
Спасибо, ноль. Да, если я прокомментирую строку, ответ все равно будет отправлен обратно. Итак, вы правы - это должна быть какая-то нижняя часть ОС, которая обрабатывает пинги, прежде чем они доберутся до меня. Я мог бы сделать то же самое в TCP очень легко, но я пытаюсь собрать ICMP-туннель. – Fidel
Это совершенно другой IP-протокол. ICMP! = TCP. –
Действительно, Мартин. Идея туннелирования состоит в том, что вы ставите один протокол через другой ... – Fidel