1

現在、単純な ping プログラムを実装して、C# と .NET でのネットワーク プログラミングについて独学しようとしています。

raw ソケットを初期化し、ICMP エコー要求パケットを正しく構築することができました。私のプログラムを実行すると、Wireshark は目的の宛先にエコー要求を送信していることを確認しますが、リモート マシンは決してエコー応答を返しません。複数のマシンに送信してみましたが、すべて同じ結果でした (これらの各マシンは、Windows の ping ユーティリティを使用して 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);

リモート マシンが応答を返さない理由を誰かが提案できれば、非常にありがたいです。

4

2 に答える 2

1

ご質問の情報から確実に知ることは困難です。うまくいかないことが多すぎます。しかし、ここに私がチェックし始めるいくつかがあります.

  • ICMP パケットが正しくフォーマットされていない可能性があります。Wireshark を使用して、カスタム ping パケットの結果を既知の機能しているユーティリティの結果と比較し、違いがあるかどうかを確認します。
  • destinationIPとのremoteEndpoint値は異なるアドレスを指している可能性があります。ありそうもないが、それを呼びたかった
  • 問題の IP は、単に ping 要求を拒否している可能性があります。別のツールで ping を返していることを確認します
  • ファイアウォールが邪魔をしている可能性があります。一時的に無効にしてから、プログラムを再実行して、それが原因かどうかを確認しました。
于 2012-01-12T16:07:12.933 に答える
0

独自のパケットを作成する必要がありますか? 他にPingクラスがあります

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

編集:

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);
}
于 2012-01-12T16:05:26.180 に答える