# Ping über IP Bereich



## heut (9. Juli 2009)

Hallo!

Ich muss hier für ein Projekt in einem IP Bereich überprüfen, welche Rechner erreichbar sind. Ich kann zwar über isReachable bei InetAdress für eine einzelne IP festellen, ob sie erreichbar ist. Aber sobald ich das in einen eigenen Thread packe und ein paar Instanzen davon quasi gleichzeitig starten will, ist der 1. true und alle anderen false.

Dann hab ich das gleiche über einen Socket und dem Port 80 versucht (die relevanten Rechnen haben einen SOAP Service gestartet und sollten darum ja auf 80 erreichbar sein?). In dem Thread steht dann der folgende Code:

```
try {
    Socket Client = new Socket (this.IP, 80);
    Client.close ();
    System.out.println (this.IP + ": true");
} catch (Exception e) {
    System.out.println (this.IP + ": false");
}
```

Das scheint auch ganz gut zu funktionieren. Aber nach 10 bzw. manchmal nach 11 Aufrufen stockt das ganze. Ich meine auch irgendwo gelesen zu haben, dass im System 10 Verbindungen meistens als Standard eingestellt sind.
Ich möchte ja auch gar nicht mehr als 10 parallel, aber offenbar reicht es nicht, den Socket wieder zu schließen. Es geht nach den 10 anfragen nur sehr stockend weiter.

Hat jemand ne Idee, wie ich das Problem lösen kann?

heut


----------



## d4rkY89 (14. August 2009)

Hi. Ich habe mir auch mal ein Netzwerkscanner geschrieben. Dieser Funktioniert ganz ohne Sockets (er nutzt das Windowsnetzwerk. Meines Wissens nach heißt es Samba. Sicher bin ich mir allerdings nicht).


```
import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

public class LanScanner {
	private static final int TIMEOUT = 15000;

	public static void main(String[] args) {
		try {
			Enumeration<NetworkInterface> enumInterfaces = NetworkInterface.getNetworkInterfaces();
			while (enumInterfaces.hasMoreElements()) {
				NetworkInterface currentInterface = enumInterfaces.nextElement();
				if (currentInterface.isLoopback() == false && currentInterface.isUp()) {
					Enumeration<InetAddress> enumAdresses = currentInterface.getInetAddresses();
					while (enumAdresses.hasMoreElements()) {
						InetAddress currentAddress = enumAdresses.nextElement();
						new LanScanner(currentAddress);
					}
				}
			}
			// Wenn man davon ausgeht, dass nur eine Netzwerkkarte aktiv ist, dann nehmen wir die Kurzfassung:
			// new LanScanner(InetAddress.getLocalHost());
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	private LanScanner(InetAddress ia) {
		String[] sAddress = ia.getHostAddress().split("[.]");
		String lanAddress = sAddress[0] + "." + sAddress[1] + "." + sAddress[2] + ".";
		for (short s = 1; s < 255; s++) {
			new AddressScanner(lanAddress + s);
		}
	}

	private class AddressScanner implements Runnable {
		private String sInetAddress = null;

		private AddressScanner(String inetAddress) {
			this.sInetAddress = inetAddress;
			new Thread(this).start();
		}

		public void run() {
			try {
				InetAddress ia = InetAddress.getByName(this.sInetAddress);
				if(ia.isReachable(TIMEOUT) || !ia.getCanonicalHostName().equalsIgnoreCase(this.sInetAddress) || !ia.getHostName().equalsIgnoreCase(this.sInetAddress)) {
					System.out.println("Reached " + this.sInetAddress + "(" + ia.getCanonicalHostName() + ")");
				}
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
```

Die if-Bedinung besteht aus dem folgenden Grund 3 Bedingungen.
-Da die isReachable(int)-Methode über das Windwosnetzwerk läuft kann es öfters passieren, dass ein Rechner nicht in der TIMEOUT-Zeit antwortet. Das kennst du bestimmt auch, wenn du die Netzwerkumgebung öffnest und der Rechner teilweise minutenlang IP-Addressen abfragt, die sich noch im Cache befinden.
-Da es also passieren kann, dass der TIMEOUT erreicht wird lösen wir einfach ganz dreist den Namen auf. Erhalten wir einen Namen zu einer IP existiert der Rechner eben doch, hat nur nicht in der TIMEOUT-Zeit geantwortet.

Teilweise kann es eben auch passieren, dass wir den Host erreichen allerdings den Namen nicht auflösen können. Firewalls wie ZoneAlarm können ein Grund dafür sein.


----------

