リモートマシンのUDPポートがファイアウォールを通過しているかどうか、および/またはアプリケーションが実行されているかどうかを判断しようとしていると思います。
これを確実に判断することはできません。最も近い方法は、一連の小さなデータグラムをそのアドレスとポートに、約1秒間隔で約10秒間送信してみることです。
ポートをブロックしているファイアウォールがなく、アプリケーションが実行されていない場合、リモートシステムが送り返す可能性がありますICMP_UNREACH_PORT
(ポートに到達できません)。ICMP_UNREACH_HOST
ブロッキングファイアウォールがなく、リモートシステムがダウンしている場合、ルーターがまたはを送り返す可能性がありますICMP_UNREACH_NET
。ファイアウォールがあなたをブロックしている場合、それは返送するかもしれませんICMP_UNREACH_FILTER_PROHIB
が、ほとんどのファイアウォールは何も返送しません。
ほとんどのファイアウォールがその種のICMPフィードバックをブロックするため、これらのいずれかを取り戻す可能性はかなり低くなります。ICMPメッセージが戻ってきたとしても、rootとして実行していない限り、Linuxは通常それを表示しません。一部のオペレーティングシステムは、同じアドレス/ポートの隣の障害としてICMPエラーを報告します。そのためsendto()
、メッセージを数回繰り返す必要があります。ただし、そうでないものもあります。その場合は、特定のICMPポートを開いて、リターンメッセージを解析する必要があります。
どういうわけかICMPメッセージを受け取ったとしても、それらは信頼できないことを理解してください。たとえばICMP_UNREACH_PORT
、アプリケーションがリッスンしているだけでなく、積極的にデータを送信している場合でも、取得できます。(それはまれですが、私はそれが起こるのを見ました。)
アプリケーションが特定のポートで実行されていて、そのアプリケーションが何であるかを知っていて、そのアプリケーションが応答するメッセージを作成する方法を知っている場合は、そうして応答を取得することが、そのポートを示す最良の指標です。開いています。ただし、応答がないということは何の意味もありません。ポートがブロックされているか、アプリケーションが実行されていないか、メッセージが気に入らなかった可能性があります。
結論:いいえ、そうではありません。