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
スキャンで見られるように、ローカルネットワークにデバイスがあります。
タイムアウトを増やしてみてください。私は約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
}
}
私のために完璧に働いた。
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を実行しようとしましたか?
次のように、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");
}
}
自動検出コード用にこのサンプルを取りました ここから
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);