特定の開いているポート (5050) の範囲内のすべての IP をスキャンし、開いている場合はログにメッセージを書き込むアプリを作成しようとしています。
コードはこちら:
public void run(){
for(int i=0;i<256;i++)
{
Log.d("NetworkScanner","attemping to contact 192.168.1."+i);
try {
Socket socket=new Socket(searchIP+i,5050);
possibleClients.add(searchIP);
socket.close();
Log.d("NetworkScanner"," 192.168.1."+i+" YEAAAHHH");
} catch (UnknownHostException e) {
Log.d("NetworkScanner"," 192.168.1."+i+" unavailable");
} catch (IOException e) {
e.printStackTrace();
}
}
}
編集: ここに新しい問題があります: ホストがポートを開かずにオンラインで見つかった場合でも、スキャンプロセス (for ループ) は次に移動する前に長時間スタックします。また、各ホストのスキャンにはかなりの時間がかかります!
最終的な解決策は、デフォルトのコンストラクターで Socket オブジェクトを作成し、ホストの InetAddr オブジェクトを作成してから、ソケット API の Connect(InetAddr,timeout) 関数をミリ秒単位 (約 300ms) のタイムアウトで使用することでした。 300 ミリ秒以下 (200 ミリ秒未満ではエラーが発生する可能性があります) とマルチスレッド化による並列スキャンにより、範囲内のすべての IP を 5 秒でスキャンできます。