# Subnetzaddresse auslesen



## Stefan_ (17. Feb 2010)

Hallo erstmal,

ich und ein Freund machen für die Schule ein Projkt wo wir einen Chat programmieren mit dem man übers Netzwerk Nachrichten verschickt. Momentan funktioniert das mit den Nachrichten verschicken auch schon super. 

Als nächstes haben wir uns gedacht das wir vielleicht so etwas wie einen NetScanner machen der das Netz scanned und nach Computer sucht die mit dem Netzwerk verbunden sind. Dafür haben wir als ersten Lösungsansatz das wir alle Ip´s scannen die in diesem Netzwerk möglich sind und zu schauen ob auch ein dazugehöriger PC vorhanden ist. Da es aber sehr viel Zeit in anspruch nehmen würde alle IP ´s die es gibt zu scannen haben wir uns jetzt gedacht man kann sich ja über die eigene HOst Adresse des PC´s  und die Subnetzaddresse die ungefähre Anzahl an PC´s ausrechnen die in diesem Netzwerk sein könnten. Das würde natürlich sehr viel Zeit sparen.

Ich würde mich über eine baldige Antwort, oder auch über andere, vor allem bessere Lösungsvorschläge sehr freuen

mfg Stefan.


----------



## dayaftereh (17. Feb 2010)

Also ich würde mir meine IP adresse Hollen und dan schaue in welchem Netz ich bin. z.b. meine IP = 192.168.2.23, dan ist mein SubNetz 192.168.2.x, so an jede dan ein ICMP-Ping schicken:

```
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;


public class Test {
	
	public static void main(String[] args) {
		List<String> ips = getSubReachableIPs();
		
		for (String ip : ips) {
			System.out.println("Found: " +ip);
		}
	}
	
	public static List<String> getSubReachableIPs(){
		List<String> ips = new ArrayList<String>();
		byte[] homeIP = getHostAddress();
		String subIP = (homeIP[0] & 0xFF)+ "." + (homeIP[1]& 0xFF) + "." + (homeIP[2]& 0xFF) + ".";
		String ip = null;
		int timeout = 3000;
		
		for (int i = 150; i < 165; i++) {
			ip = subIP + i;
			try {
				System.out.println("Ping: " + ip);
				if(InetAddress.getByName (ip ).isReachable (timeout)){
					ips.add(ip);
				}				
			} catch (Exception e) {				
				e.printStackTrace();
			}			
		}
		
		return ips;
	}
		
	public static byte[] getHostAddress() {
		try {
			String localHost = InetAddress.getLocalHost().getHostName(); 
			
			for ( InetAddress ia : InetAddress.getAllByName(localHost) ){
				if(ia.isLoopbackAddress() == false){
					return ia.getAddress();					
				}
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return new byte[]{127,0,0,1};
	}

}
```

Hoffe das Hilft dir!


----------



## Stefan_ (17. Feb 2010)

Danke für die schnelle Antwort..

Ja genau so etwas habe ich gesucht..

Ich habe aber jetzt das Problem das es bestimmte Computer nicht findet. Zum beispiel wenn ich es jetzt von 192.168.10.190 bis 192.168.10.200 durchlaufen lasse und ich aber weiß das mit der IP 192.168.10.193 ein Computer zum Netzwerk verbunden ist, findet das Programm diesen aber nicht. an was kann das liegen?


----------



## dayaftereh (17. Feb 2010)

Es kann sein das der Ping länger als 3000ms dauert! Setze den Timeout mal hoch! damit er nicht so früh raushüpft! Wenn nicht Mache es Über eine Socket, also öffnen eine Socken zu der IP am Port des Chats, so bekommst du nur die IPS die auch den Chat am laufen haben!


----------



## Stefan_ (17. Feb 2010)

Ok also es funktioniert leider auch nicht wenn ich das ganze auf 10000ms setzte..

Aber wie mache ich das dann am besten das der Socket nach einer gewissen Zeit abbricht wenn er keine Verbindung erstellen kann... sprich wie wäre es am besten das ich das alles schnell durchlaufen kann.


----------



## hemeroc (17. Feb 2010)

Wenn es dir darum geht alle IP's zu finden die gerade das chat programm am laufen haben kann ich dir folgende technologie raten:

Broadcast address - Wikipedia, the free encyclopedia

das hat bei unsere projekte sehr gut funktioniert. verursacht recht wenig traffic und geht sehr schnell.

LG Hemeroc


----------



## dayaftereh (17. Feb 2010)

Also ichg laube es gibt nix gutes in der Richtung! habe das mal mit dem Socket versucht aber da dauert das Stunden! ich habe beim Googeln das hier gefunden https://pingsweeper.dev.java.net/ vielicht findest du mehr infos!


----------



## Stefan_ (17. Feb 2010)

Also erstmals danke für die beiden Antworten...

@hemeroc...

also meinst du damit das man über die Broadcast Addresse an alle User im Netzwerk eine Nachricht verschicken sollte ? und wenn dann von dem Server eine Rückmeldung kommt dann weiß man das der Computer online ist?. Ich hoffe ich hab das richtig verstanden denn das wäre genial .. da bräuchte man überhaupt nichts mit IPScans machen


----------



## hemeroc (17. Feb 2010)

Genau das ist die Idee.
Dazu muss auf den rechnern dein chatclient laufen, der dann auf den broadcast beispielsweise mit seiner ip und dem offenen port antwortet.

MulticastSocket (Java Platform SE 6)

das könnte dir noch helfen.
LG


----------



## Stefan_ (19. Feb 2010)

So, wir haben uns jetzt für die Version mit dem BroadCast entschieden. Aber momentan sind noch ein paar Fragen offen:
1. Wie kommt man am besten zu der Broadcast Addresse
2. Mit welchem Socket sollte man etwas an die Broadcast Addresse schicken so das es dann an de ganzen anderen Hosts geschickt wird.
Danke schon mal für die Antworten.


----------



## FKorni (19. Feb 2010)

Hallo, als sein Projektpartner melde ich mich hier jetzt auch mal. 

Wir haben jetzt versucht das ganze über Broadcast zu realisieren, nur das Problem ist, dass der Server irgendwie nie eine Nachricht bekommt, statt dessen empfängt der Client seine eigene Nachricht an Stelle der Servers.

Die zwei Klassen sehen so aus:

Client:

```
public class UDPEchoClient {
    private static final int ECHO_PORT = 1234;

    public static void main(String[] args) throws InterruptedException {
        DatagramSocket udpSocket = null;
        try {
            udpSocket = new DatagramSocket(ECHO_PORT);
            udpSocket.setBroadcast(true);
            byte[] buffer = new String("Ist da jemand ?").getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.1.255"), ECHO_PORT);
            
            System.out.println("Sende Nachricht.");
            udpSocket.send(packet);
            
            
            buffer = new byte[1024];
            packet = new DatagramPacket(buffer, buffer.length);
            udpSocket.setSoTimeout(15000);
            udpSocket.receive(packet);

            System.out.print("Antwort von " + packet.getAddress().getHostAddress() + ":");
            System.out.println(new String(packet.getData(), 0, packet.getLength()));
        } catch (SocketTimeoutException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            udpSocket.close();
        }
    }
}
```

Server:

```
public class UDPEchoServer {
    private static final int ECHO_PORT = 1;

    public static void main(String[] args) {
        DatagramSocket udpSocket = null;
        try {
            udpSocket = new DatagramSocket(ECHO_PORT);
            udpSocket.setBroadcast(true);
            while (true) {
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                System.out.println("Done");
                udpSocket.receive(packet);
                System.out.println("Done");
                InetAddress sendeAdresse = packet.getAddress();

                System.out.print("Nachricht von " + sendeAdresse.getHostAddress() + ":");
                System.out.println(new String(packet.getData(), 0, packet.getLength()));
                System.out.println("Sende Antwort.. ");
                String antwort = "Hallo!";
                packet = new DatagramPacket(antwort.getBytes(), antwort.length(), sendeAdresse, ECHO_PORT);
                udpSocket.send(packet);
                System.out.println("Antwort gesendet!");
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            udpSocket.close();
        }
    }
}
```

Nun, hat von Euch einer eine Ahnung woran das liegen könnte? Wäre Euch sehr dankbar für jegliche Rückmeldung.


----------



## FKorni (22. Feb 2010)

Weiß keiner warum das so nicht funktionier?

EDIT: Das Thema hat sich erledigt, funktioniert doch.


----------



## Stefan_ (22. Feb 2010)

Hallo, nochmal. 

Leider haben wir weiterhin noch das Problem mit der SUbnetzmaske und ich komme einfach nicht draf wie ich diese auslesen sollte..

hat vl hie jemand eine idee?


----------



## lumo (24. Feb 2010)

1) sucht ihr in windows oder in linux nach den daten?
2) lan oder wan? braucht ihr den default gateway auch?


----------



## Empire Phoenix (24. Feb 2010)

Nun ne simple methode unter widows wäre per Process IpConfig aufzurufen, und den outstream von dem Process dann weiterverarbeiten.


```
C:\Users\EmpirePhoenix>ipconfig

Windows-IP-Konfiguration


Ethernet-Adapter LAN-Verbindung 2:

   Verbindungsspezifisches DNS-Suffix: uni-mannheim.de
   Verbindungslokale IPv6-Adresse  . : fe80::a9cf:3e0f:a24f:a917%22
   IPv4-Adresse  . . . . . . . . . . : 134.155.146.119
   Subnetzmaske  . . . . . . . . . . : 255.255.248.0
   Standardgateway . . . . . . . . . : 134.155.144.1

Ethernet-Adapter Tinc-Vpn:

   Medienstatus. . . . . . . . . . . : Medium getrennt
   Verbindungsspezifisches DNS-Suffix:

Ethernet-Adapter touni:

   Verbindungsspezifisches DNS-Suffix: uni-mannheim.de
   Verbindungslokale IPv6-Adresse  . : fe80::d99a:2a98:7460:d859%12
   IPv4-Adresse  . . . . . . . . . . : 10.20.0.84
   Subnetzmaske  . . . . . . . . . . : 255.255.252.0
   Standardgateway . . . . . . . . . : fe80::4b0:b4b6:fd42:806d%12
                                       10.20.0.1

Ethernet-Adapter home:

   Verbindungsspezifisches DNS-Suffix:
   IPv4-Adresse  . . . . . . . . . . : 192.168.42.2
   Subnetzmaske  . . . . . . . . . . : 255.255.255.0
   Standardgateway . . . . . . . . . :

Tunneladapter isatap.uni-mannheim.de:

   Medienstatus. . . . . . . . . . . : Medium getrennt
   Verbindungsspezifisches DNS-Suffix: uni-mannheim.de

Tunneladapter Teredo Tunneling Pseudo-Interface:

   Medienstatus. . . . . . . . . . . : Medium getrennt
   Verbindungsspezifisches DNS-Suffix:

Tunneladapter isatap.{DB632FB4-25AB-4B88-81DB-012C0CA0C822}:

   Medienstatus. . . . . . . . . . . : Medium getrennt
   Verbindungsspezifisches DNS-Suffix:

Tunneladapter 6TO4 Adapter:

   Verbindungsspezifisches DNS-Suffix: uni-mannheim.de
   IPv6-Adresse. . . . . . . . . . . : 2002:869b:9277::869b:9277
   Standardgateway . . . . . . . . . : 2002:c058:6301::c058:6301
```

Hm habe ich schon erwähnt das das uni vpn seltsam is ^^


----------



## lumo (24. Feb 2010)

@Empire Phoenix darum meine frage linux oder windows...
hab mit dem schon gearbeitet und mir was zusammengebastelt, was nur die LAN-daten rausfilter...


----------



## FKorni (24. Feb 2010)

```
private String getSubnet() throws IOException{
        Process process = Runtime.getRuntime().exec("ipconfig");
        Scanner scanner = new Scanner(process.getInputStream());
        StringWriter stringWriter = new StringWriter();

        String line;

        while(scanner.hasNextLine()){
            if((line=scanner.nextLine()).contains("Subnetzmaske")){
                return(line);
            }
        }
        return null;
    }
```

Damit könnte ich jetzt die Subnetzmaske auslesen. Problem dabei, es wäre nur mit Windows kompatible, zudem müsste es sich auch um die deutschsprachige Version handeln. Also wäre das eine sehr sehr schlechte Lösung eigentlich wollen wir es komplett Plattformen unabhängig gestalten.
Sollte mit W-LAN und LAN funktionieren, Standardgateway brauchen wir eigentlich nicht.


----------



## FKorni (24. Feb 2010)

[JAVA=64]private String getSubnet() throws IOException{
        Process process = Runtime.getRuntime().exec("ipconfig");
        Scanner scanner = new Scanner(process.getInputStream());
        StringWriter stringWriter = new StringWriter();

        String line;

        while(scanner.hasNextLine()){
            if((line=scanner.nextLine()).contains("Subnetzmaske")){
                return(line);
            }
        }
        return null;
    }[/code]

Damit könnte ich jetzt die Subnetzmaske auslesen. Problem dabei, es wäre nur mit Windows kompatible, zudem müsste es sich auch um die deutschsprachige Version handeln. Also wäre das eine sehr sehr schlechte Lösung eigentlich wollen wir es komplett Plattformen unabhängig gestalten.
Sollte mit W-LAN und LAN funktionieren, Standardgateway brauchen wir eigentlich nicht.

PS: Sorry für Dopplepost.


----------



## HoaX (24. Feb 2010)

Wieso so kompliziert und nicht einfach NetworkInterface (Java Platform SE 6) verwenden? Damit wäre dann auch wieder die Platformunabhängigkeit gegeben.


----------



## FKorni (24. Feb 2010)

Nur wissen wir nicht wie es damit funktionieren soll. Wir wären dir für ein kleines Beispiel sehr dankbar.


```
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.5"));
        
        List<InterfaceAddress> address = networkInterface.getInterfaceAddresses();

        for (InterfaceAddress interfaceAddress : address) {
            System.out.println("Broadcast " + interfaceAddress.getBroadcast());
        }
```

So bekomme ich immer die falsche Adresse bzw. immer "255.255.255.255".


----------



## HoaX (26. Feb 2010)

Also hier kommt da das richtige Ergebnis raus, egal ob ich es mit NetworkInterface.getByName oder getByInetAddress probiere.

Groovy

```
import java.net.*

//iface = NetworkInterface.getByName("eth0")
iface = NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.9.20"))

addresses = iface.interfaceAddresses

addresses.each { a ->
   println a.broadcast;
}
```

Oder was meinst du mit falsche Adresse?


----------



## Stefan_ (26. Feb 2010)

Was wird denn da bei dir ausgegeben?


----------



## HoaX (28. Feb 2010)

192.168.9.255 natürlich


----------



## Stefan_ (28. Feb 2010)

Also bei uns gibt es da nur immer 255.255.255.255 aus..

ist das da oben eig Pseudocode oder was ist Groovy??


----------



## Gast2 (28. Feb 2010)

Stefan_ hat gesagt.:


> Also bei uns gibt es da nur immer 255.255.255.255 aus..


was ist so schlimm an "255.255.255.255" als Subnetzmaske?


----------



## Stefan_ (28. Feb 2010)

Das wäre die falsche Subnet 
und außerdem will ich damit ja die Broadcast Addresse auslesen.


----------



## HoaX (28. Feb 2010)

Naja, 255.255.255.255 is ja n Broadcast, aber halt für alle Netze in denen du drin hängst. Welches OS verwendest du? Und die 192.168.1.5 ist deine IP oder die von einem anderen Rechner?


----------



## Gast2 (28. Feb 2010)

mogel hat gesagt.:


> was ist so schlimm an "255.255.255.255" als Subnetzmaske?





Stefan_ hat gesagt.:


> Das wäre die falsche Subnet


Subnetz != Subnetzmaske



HoaX hat gesagt.:


> Naja, 255.255.255.255 is ja n Broadcast, aber halt für alle Netze in denen du drin hängst.


theoretisch ja - praktisch muss der Router das entsprechend in die anderen Subnetze durchreichen ... Java selber bietet (AFAIR) irgendwo eine Broadcast-Konstante an ... das dürfte aber auch die 255.255.255.255 sein


----------



## Stefan_ (28. Feb 2010)

Also sry wegen den Begriffen .. ich meinte natürlich Subnetmaske ..

als OS verwende ich Windows 7

Die Ip Addresse meines Rechner wäre momentan :
196.168.2.20

Die Subnetzmaske:
255.255.255.0


----------



## FKorni (4. Mrz 2010)

Kann uns keiner mehr weiterhelfen?


----------



## Gast2 (4. Mrz 2010)

Subnetz = IP && MASK
Broadscast = IP || !MASK


----------



## FKorni (4. Mrz 2010)

Bleibt immer noch die Frage wie ich jetzt an die MASK komme.


----------



## FKorni (7. Mrz 2010)

Push


----------



## heebli (13. Mai 2010)

Habe zu diesem Thema noch einen interessanten Beitrag gefunden.

Enigma To Eureka: Finding Your IP v4 Broadcast Address Using Java

Anscheinend muss vor dem ersten Aufruf java.net.preferIPv4Stack auf true gesetzt werden, damit nicht der IPv6 Stack verwendet wird und nicht mehr 255.255.255.255 rauskommt.


----------



## FKorni (13. Mai 2010)

Danke, funktioniert jetzt super.


----------

