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.
 

dayaftereh

Top Contributor
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!
 

Stefan_

Mitglied
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

Top Contributor
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_

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

Stefan_

Mitglied
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
 

Stefan_

Mitglied
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

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

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:

Stefan_

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

Empire Phoenix

Top Contributor
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:

lumo

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

FKorni

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

FKorni

Mitglied
[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:

FKorni

Mitglied
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".
 

HoaX

Top Contributor
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?
 

HoaX

Top Contributor
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?
 
G

Gast2

Gast
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
 

Stefan_

Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Html Auslesen Netzwerkprogrammierung 6
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
J WLAN-Signalstärke in dbm auslesen Netzwerkprogrammierung 1
C IFrame mit java auslesen Netzwerkprogrammierung 1
DeathsGun Zeile von Streamcloud auslesen Netzwerkprogrammierung 1
Z HTTP HTML Element auslesen in Java Netzwerkprogrammierung 1
D Webseite(mit JavaScript-Element) mit Java auslesen Netzwerkprogrammierung 0
J Webformular auslesen Netzwerkprogrammierung 2
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
B XMLRPC-Schnittstelle. Einzelne Felder aus dem Object auslesen Netzwerkprogrammierung 2
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
precoc IP Auslesen Netzwerkprogrammierung 4
S HTML mit AJAX auslesen Netzwerkprogrammierung 2
S HTTP Pakete Auslesen Netzwerkprogrammierung 22
B Authentifikation und anschliesendes auslesen von JSON Netzwerkprogrammierung 2
M lokale Benutzer auslesen Netzwerkprogrammierung 28
H Verzeichnis auf Server auslesen Netzwerkprogrammierung 13
S Bluetooth -Gerätename -Geräteadresse auslesen Netzwerkprogrammierung 4
M Proxy Einstellungen auslesen Netzwerkprogrammierung 2
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
Geese HTML Quelltext auslesen ergibt -null- Netzwerkprogrammierung 2
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
N Systemeinstellung Proxyserver auslesen Netzwerkprogrammierung 2
V Quelltaxt einer Website auslesen funktioniert nicht Netzwerkprogrammierung 2
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
M IP-Auslesen und ändern Netzwerkprogrammierung 25
B Globale IP-Adresse auslesen - Java Applet Netzwerkprogrammierung 2
S Port auf einer bestimmten IP-Adresse auslesen? Netzwerkprogrammierung 6
S website auslesen schlägt fehl Netzwerkprogrammierung 20
L Body eines http Request auslesen Netzwerkprogrammierung 2
P URL Parameter auslesen Netzwerkprogrammierung 5
G Kryptische Zeichen beim Auslesen einer Website Netzwerkprogrammierung 11
S redirected html auslesen Netzwerkprogrammierung 10
F Timestamp aus IP-Header auslesen Netzwerkprogrammierung 2
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
A SSL Zertifikat - modulus auslesen und vergleichen Netzwerkprogrammierung 1
F URL geordnet auslesen Netzwerkprogrammierung 3
E ordnerberechtigungen auslesen Netzwerkprogrammierung 2
P Textdateien aus Oracle-DB mittels Java auslesen und öffnen Netzwerkprogrammierung 7
G push clientseitig auslesen Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
C PCAP Datei auslesen Netzwerkprogrammierung 8
M Rechner einer Domäne auslesen? Netzwerkprogrammierung 3
J Active Directory mit Java auslesen Netzwerkprogrammierung 1
M Öffentliche IP auslesen Netzwerkprogrammierung 13
S Verzeichnis auslesen (FTP Jakarta Commons Net) Netzwerkprogrammierung 2
L netzwerkkarte traffic auslesen Netzwerkprogrammierung 15
T Quelltext einer Website auslesen Netzwerkprogrammierung 3
C JSP Parameter auslesen Netzwerkprogrammierung 1
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
J Client/Server vorhandene Textdatei auslesen Netzwerkprogrammierung 14
C IP adresse anhand einer domain adresse auslesen / ermitteln Netzwerkprogrammierung 3
D SOAP Message abfangen und auslesen Netzwerkprogrammierung 3
G IP auslesen, ändern Netzwerkprogrammierung 8
F IP-Adresse auslesen Netzwerkprogrammierung 7
N TCP Stream auslesen Netzwerkprogrammierung 7
A HTML code auslesen klappt nicht ganz Netzwerkprogrammierung 3
D Bekomme Dummyspace beim Internetseiten auslesen Netzwerkprogrammierung 2
B Netzwerktraffic auslesen Netzwerkprogrammierung 7
D Byte-Zähler des Netzwerkinterface auslesen Netzwerkprogrammierung 2
L Web-Seiten Inhalt auslesen und in textfile speichern Netzwerkprogrammierung 2
D txt Datei auslesen mittels URL Netzwerkprogrammierung 7
G binärwert aus 2 byte auslesen Netzwerkprogrammierung 7
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
K SMB User auslesen Netzwerkprogrammierung 3
L Logingeschützte Website mit mehreren Accs auslesen Netzwerkprogrammierung 3
B Workgroup namen auslesen Netzwerkprogrammierung 4
J dynamische Router-IP auslesen Netzwerkprogrammierung 6
M IP Adressen auslesen und in Windows/Linux übergeben Netzwerkprogrammierung 5
G Ips auslesen Netzwerkprogrammierung 2
O [IRC] Userliste und Server Messages auslesen und anzeigen Netzwerkprogrammierung 4
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9

Ähnliche Java Themen


Oben