web-dev-qa-db-ja.com

ローカルネットワーク内のすべてのIPアドレスを検索する

Javaコードを使用して、現在接続しているローカルネットワーク内のデバイスのすべてのIPアドレスを検索したい。便利なユーティリティ Advanced IP Scanner は次のことができます。 192.168.178/24の-​​ subnet でさまざまなIPアドレスを見つけます。

this の回答によると、次の方法でコードを作成しました。

import Java.io.IOException;
import Java.net.InetAddress;

public class IPScanner
{
    public static void checkHosts(String subnet) throws IOException
    {
        int timeout = 100;
        for (int i = 1; i < 255; i++)
        {
            String Host = subnet + "." + i;
            if (InetAddress.getByName(Host).isReachable(timeout))
            {
                System.out.println(Host + " is reachable");
            }
        }
    }

    public static void main(String[] arguments) throws IOException
    {
        checkHosts("192.168.178");
    }
}

残念ながら、これは結果を出力しません。つまり、IPアドレスに到達できません。どうして? Advanced IP Scannerスキャンで見られるように、ローカルネットワークにデバイスがあります。

8
BullyWiiPlaza

タイムアウトを増やしてみてください。私は約5000msを使用しました、これは私を助けました。 5000ms * 254 = 21分待ちたくない場合は、アドレスへの並列pingを使用して次のコードも試してください。

public static void getNetworkIPs() {
    final byte[] ip;
    try {
        ip = InetAddress.getLocalHost().getAddress();
    } catch (Exception e) {
        return;     // exit method, otherwise "ip might not have been initialized"
    }

    for(int i=1;i<=254;i++) {
        final int j = i;  // i as non-final variable cannot be referenced from inner class
        new Thread(new Runnable() {   // new thread for parallel execution
            public void run() {
                try {
                    ip[3] = (byte)j;
                    InetAddress address = InetAddress.getByAddress(ip);
                    String output = address.toString().substring(1);
                    if (address.isReachable(5000)) {
                        System.out.println(output + " is on the network");
                    } else {
                        System.out.println("Not Reachable: "+output);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();     // dont forget to start the thread
    }
}

私のために完璧に働いた。

3
The_Programmer

InetAddress.isReachableは、ICMP ECHO REQUEST(pingを実行する場合と同様)またはポート7(エコーポート)での要求を使用します。 http://docs.Oracle.com/javase/7/docs/api/Java/ net/InetAddress.html#isReachable%28int%29

高度なIPスキャナーは、おそらく別の方法を使用してホストを検出します(radminポートでの要求やhttpでの要求など)。

ホストは稼働している可能性がありますが、ICMP ECHOREQUESTに応答していません。

コマンドラインからホストの1つにpingを実行しようとしましたか?

2
seneque

次のように、getByNameの代わりにInetAddress.getByAddress(Host)を使用してみてください。

    InetAddress localhost = InetAddress.getLocalHost();
    byte[] ip = localhost.getAddress();

    for (int i = 1; i <= 254; i++)
    {
        try
        {
            ip[3] = (byte)i; 
            InetAddress address = InetAddress.getByAddress(ip);

            if (address.isReachable(100))
            {
                output = address.toString().substring(1);
                System.out.print(output + " is on the network");
            }
    }

自動検出コード用にこのサンプルを取りました ここから

1
vgm

Java8ストリームソリューション

    IntStream.rangeClosed(1,254).mapToObj(num -> "192.168.0."+num).parallel()
            .filter((addr) -> {
                try {
                    return InetAddress.getByName(addr).isReachable(2000);
                } catch (IOException e) {
                    return false;
                }
            }
            ).forEach(System.out::println);
0
Ivo Skalický