2012-01-12 15 views
1

現在、C#と.NETでネットワークプログラミングについて教えるための単純なpingプログラムを実装しようとしています。C#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); 

場合、私は非常に感謝されると思います。

+1

WiresharkがICMPエコー要求として識別しても、パケットに何か問題があるはずです。気になる最も可能性の高い原因は、ヘッダーチェックサム(IPとICMPの両方)です。あなたはそれらをチェックしましたか? Wiresharkは、あなたが正しいと思っているかどうかを教えてください。 – Celada

+2

送信した要求とWindowsのpingユーティリティが送信する要求には違いがありますか?あなたはwiresharkでそれらを嗅ぐことができます。違いを見つけたら、おそらくあなたの問題を見つけるでしょう。 – AVee

+0

マイクロソフトの「Ping」の実装が有益であるかどうかを調べることができます。 [参照元](http://referencesource.microsoft)から '\ Source \ .Net \ 4.0 \ DEVDIV_TFS \ Dev10 \リリース\ RTMRel \ ndp \ fx \ src \ Net \ System \ Net \ NetworkInformation \ ping.cs'を参照してください。 .com/netframework.aspx) – Brian

答えて

1

それはあなたの質問に記載されている情報から確実に知ることは難しいです。間違っていることがあまりにも多くあります。しかしここに私がチェックを始めるいくつかのものがあります。

  • ICMPパケットのフォーマットが正しくない可能性があります。 wiresharkを使用して、独自のpingパケットの結果を既知の機能するユーティリティの結果と比較して、違いがあるかどうかを確認します。
  • destinationIPremoteEndpointの値が異なるアドレスを指す可能性があります。可能性は低いと思われるが、それを呼び出すようにしたい。
  • 問題のIPが単にping要求を拒否している可能性があります。私は別のツールでそれが返ってきていることを確認します。
  • ファイアウォールが途切れている可能性があります。私は一時的にそれを無効にし、それが原因であるかどうかを確認するためにプログラムを再実行します。
+1

フレームワーク['Ping'](http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx)クラスの実装を使用することをお勧めします最後の2つの箇条書き点を確認してください。フレームワーク「Ping」が動作している場合、アプリケーションのバグである可能性が最も高いです。フレームワーク「Ping」が失敗した場合、これは設定上の問題の可能性が最も高いです。 – Brian

0

独自のパケットを構築する必要がありますか? 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); 
} 
+1

OPはこれを学習エクササイズとしてやっているようです。既存のクラスを使用すると目的が壊れる – JaredPar

関連する問題