C # Raw сокет Получение пакетов - PullRequest
1 голос
/ 12 января 2012

В настоящее время пытаюсь реализовать простую программу ping для обучения сетевому программированию на C # и .NET.

Мне удалось инициализировать необработанный сокет и правильно создать пакет эхо-запроса ICMP. При запуске моей программы Wireshark подтверждает, что я отправляю эхо-запрос в нужное место, однако удаленный компьютер никогда не отправит эхо-ответ. Я попытался отправить на несколько машин все с одинаковым результатом (и каждый из этих компьютеров можно пропинговать с помощью утилиты Windows ping). Мой код выглядит так:

IcmpPacket echoReq = new IcmpPacket;
/*Some code to initialize packet*/
rawSocket.Send(echoReq, destinationIP); //syntax may be wrong, dont have the code infront of me sorry
rawSocket.ReceiveFrom(buffer, remoteEndpoint);

Если кто-нибудь может подсказать какие-либо причины, по которым удаленные машины не отправляют никакого ответа, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Сложно узнать наверняка по информации в вашем вопросе.Есть слишком много вещей, которые могут пойти не так.Но вот несколько, которые я бы начал проверять.

  • ICMP-пакет мог быть неправильно отформатирован.Я бы использовал wireshark, чтобы сравнить результаты вашего пользовательского пакета проверки связи с результатами известной работающей утилиты, чтобы увидеть, есть ли различия
  • Значения destinationIP и remoteEndpoint могут указывать на разные адреса.Кажется маловероятным, но хотел вызвать его
  • Рассматриваемый IP-адрес мог просто отклонить запрос ping.Я бы проверил с помощью других инструментов, что он возвращает эхо-запросы
  • Брандмауэр может мешать.Я временно отключил его, а затем снова запустил программу, чтобы узнать, не в этом ли причина.
0 голосов
/ 12 января 2012

Вы должны создать свой собственный пакет? Есть класс Ping в противном случае

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

EDIT:

Ping pingSender = new Ping ();
PingReply reply = pingSender.Send ("www.contoso.com");

if (reply.Status == IPStatus.Success)
{
  Console.WriteLine ("Address: {0}", reply.Address.ToString ());
  Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
  Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
  Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
  Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
}
else
{
  Console.WriteLine (reply.Status);
}
...