2011-08-01 15 views
3

私はマルチスレッドのpingプログラムを作成していました。私は、それぞれのスレッド(各IP用)にrawソケットを作成し、それぞれsendto()を使ってICMPエコー要求を送信し、次に各スレッドでrecvfrom()を実行しました。私は様々なソケットのIPからメッセージを取得しています(IP1のsendtoにソケットS1を使用した場合、IP1からS1、S2などのエコー応答を得ます)。バインドする必要がありますか?PINGプログラムの作成時にICMPエコー応答を制限する

もう1つの問題は、1つのICMP要求だけを送信しても、ターゲットから多くのエコー応答を返すことです。私がこれを制限できる方法はありますか?これは私に他のICMPパケットのいくつかを見逃す原因となっています。私のプログラムがICMPエコーの送信を停止するようにターゲットに頼む方法はありますか?

ありがとう、

+0

使用しているOSは何ですか? – bdonlan

+0

私はWindowsとLinuxの同じコードをusindとしています – Gambit

+0

いくつかのデバイスはICMPエコーをブロックするので、このアプリケーションがあなたのコントロール下にないデバイスにpingを実行すると失敗する可能性があることに注意してください。 – dbasnett

答えて

3

Rawソケットはすべての着信パケットを受け取ります。あなた自身のフィルタリングを行うか、より良いことには、ただ一つのrawソケットをオープンして、入ってくるエコー応答をすべて一つのスレッドで検出する必要があります。

複数のrawソケットがあるため、重複したパケットがある可能性があります。には、各受信パケットのコピーが1つあります。場合によっては、インターネットパケットを複製することもできます(ただしこれはまれです)。

+0

それでは、ICMPの正確な動作は何ですか?要求ごとに1つの応答? – Gambit

+0

@Gambit、通常はyesですが、レスポンスをドロップすることはできませんが、まれにケースが重複する可能性があります。 – bdonlan

+0

また、ソケットのフィルタリングを設定するにはどうすればよいですか?それは私がそれぞれを読んで、正しいものかどうかを見なければならないのですか?それとももっと良い方法がありますか? – Gambit

関連する問題