Subnetzaddresse auslesen

Stefan_

Mitglied
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.
 
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:
Java:
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!
 
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?
 
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!
 
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.
 
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
 
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.
 
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:
Java:
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:
Java:
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.
 
Zuletzt bearbeitet:
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?
 
Nun ne simple methode unter widows wäre per Process IpConfig aufzurufen, und den outstream von dem Process dann weiterverarbeiten.

Code:
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 ^^
 
Zuletzt bearbeitet:
@Empire Phoenix darum meine frage linux oder windows...
hab mit dem schon gearbeitet und mir was zusammengebastelt, was nur die LAN-daten rausfilter...
 
Java:
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.
 
[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.
 
Zuletzt bearbeitet:
Nur wissen wir nicht wie es damit funktionieren soll. Wir wären dir für ein kleines Beispiel sehr dankbar.

Java:
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".
 
Also hier kommt da das richtige Ergebnis raus, egal ob ich es mit NetworkInterface.getByName oder getByInetAddress probiere.

Groovy
Code:
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?
 
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?
 
was ist so schlimm an "255.255.255.255" als Subnetzmaske?

Das wäre die falsche Subnet
Subnetz != Subnetzmaske

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
 
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
 

Zurück
Oben