現在、ネットワークに接続されているデバイスを検出しようとしています。それらのすべてにpingを実行し、「到達可能」値を確認します。ここではそれらをpingを実行し、応答を確認し、IPアドレスを巡回、その責任のコードの一部です:何らかの理由でJavaでpingコマンドを実行してネットワーク上のデバイスを検出します。
for (int i = 1; i <= 254; i++) {
String addr = IPAddress;
addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i;
InetAddress pingAddr = InetAddress.getByName(addr);
//skips the IP of 'this' device
if (pingAddr.getHostAddress().equals(IPAddress)) { continue; }
try {
//ping command
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 -w 1 " + addr);
boolean reachable = (p1.waitFor() == 0);
if (reachable) {
//add to list, if reachable
addrs.add(pingAddr);
}
} catch (IOException ex) {
} catch (InterruptedException ex) {
}
}
、コードのこの作品は、唯一のいくつかのデバイスを検出します。私は3台のノートPC、2台のアンドロイドデバイス、1台のPCをテストしています。このうち、アンドロイドデバイスの3つのラップトップのうち2つが正常に検出され、PCを検出できません。あなたはコマンドで "-w 1"に気付くことができます。私は100に設定しようとしましたが、それは年を取って終了していただけで、同じデバイスが見つかりました。
は私もすでにこの方法で試してみました:
INetAddress.isReachable(int timeout);
をしかし、それは以降、さらに悪いことになった - 私が見つけた、少なくとも何 - それはないすべてのデバイスが(私だけのAndroidデバイスへの対応TCPエコーを、使用していました)。
また、実際にはpingが遅いです。私はすでにそれを4つのスレッドに分割しましたが、それでもスピードブーストを使用できます。
私の最終的な質問は次のようなものです:なぜpingコマンドがすべてのデバイスを検出できないのですか&私の目標を達成するために考えられる方法はありますか?
有益な答えをありがとう。ファイアウォールは実際には「問題」でしたが、他のデバイス(同じOS)もファイアウォールの背後にあり、対応しました。 コードを更新していただきありがとうございます。 しかし、ファイアウォールの後ろに、そのようなデバイスを見つける方法はありますか?たとえば、ある企業のネットワークでこのネットワーク上のデバイスを見つけることができるようにするには、このコードが役に立ちます。 そうでない場合は、私はこの質問に合格とマークします。 –
ルータにアクセスすると、接続されているマシンに関する情報を得ることができます。 2番目のアイデアは、nslookupコマンドを試すことです。 – BuMcha
パフォーマンス向上のために私が送ったコードを更新しました。しかし、私はこの例外を受け取ります: I/System.out:java.io.IOException:exec()を実行中にエラーが発生しました。コマンド:[CMD、/ c、ping -n 1 -w 1 192.168.1.245]作業ディレクトリ:null環境:(余りにも長すぎると..) –