10

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

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

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スキャンで見られるように、ローカル ネットワークにデバイスがあります。

4

4 に答える 4

3

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 ECHO REQUEST に応答しない場合があります。

コマンドラインからホストの 1 つに ping を試みましたか?

于 2015-09-10T11:39:30.220 に答える
1

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

    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");
            }
    }

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

于 2015-09-10T13:00:49.980 に答える