[Java] IP Adresse im Netzwerk erreichbar

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von frankred, 28. Dezember 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 28. Dezember 2009
    IP Adresse im Netzwerk erreichbar

    Hi Leute,
    möchte nen kleinen LanChat in Java schreiben um mich mit Sockets und Ports ein bisschen ausseinander zu setzten.
    Ich denke das Problem ist bekannt und es gibt schon eine Perfekte Lösung dafür.
    Der LanChat läuft auf dem Port (zum testen erstmal) "6669". Gibt es jetzt eine Möglichkeit wenn ein Client geöffnet wird, alle möglichen IPs des Sbunet zu scannen um zu schauen wo der Server läuft.

    Meine vorgehensweise wäre folgende.

    Erstmal alle Online IPs herrausfinden:
    (Nur code zum testen, später wird noch eine Richtige methode geschrieben die aus der Subnetmaske alle möglichen IPs errechnet. Quasi die IP-Range. Oder gibts da auch schon fertige Lösungen ?)
    Code:
    
     for(int i = 100; i < 256; i++){
     try {
     System.out.println("192.168.2." + i);
    
     if(InetAddress.getByName("192.168.2." + i).isReachable(6000)){
     reachableIps.add("192.168.2." + i);
     System.out.println("REACHABLE: " + "192.168.2." + i);
     }
     } catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     }
     }
    
    leider erkennt ".isReachable" meinen laptop-pc nicht obwohl der die IP 192.168.2.103 hat, das verstehe ich beim bessten Willen nicht.

    Anschließend würde ich dann den Port der jeweiligen IPs scannen.

    Alle die den Port 6669 offen haben sind mögliche Clients oder Server....

    ....


    Was meint ihr dazu. Ehrlich gesagt tappe ich noch einwenig im dunklen da Subnetting und Netzwerktechnik nie groß meine Stärke war :).
     

  2. Anzeige
    Heute: Deals & Sale mit stark reduzierten Angeboten finden.
  3. #2 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Hallo,
    du hast jetzt die Methode InetAddress.isReachable(int timeout) genommen.

    Auszug aus der API von deiner Methode (
    InetAddress (Java 2 Platform SE 5.0)
    )
    Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible.

    Du kannst es ja eventuell mal ohne Firewall versuchen.

    btw:
    for(int i = 100; i < 255; i++)
    255 ist der Broadcast, den brauchst du wohl nicht mitscannen. ;-)

    Gruß
     
  4. #3 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Die besten Ergebnisse erreichst du eventuell über ARP-Requests, damit müsste man auch Rechner mit aktivierter Firewall problemlos finden können.
     
  5. #4 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Ich kenn Java zwar nicht näher, glaube allerdings kaum dass man die so einfach versenden kann. Selbst unter C/C++ muss man auf externe Bibliotheken wie libcpap zurückgreifen.

    Statt jede IP anzupingen, empfiehlt es sich an den Broadcast (x.x.x.255) zu senden. Diese Nachrichten werden nämlich von allen PCs empfangen. Dann muss halt noch geantwortet werden und schon hat man alle IPs zusammen.
     
  6. #5 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    also in meinem netzwerk funktioniert dein code.
    habe jeden meiner rechner gefunden.
    liegt dann wohl an firewall o.ä.

    edit: leider ist das alles sehr langsam.
    ist schon blöd, wenn der chat client erstmal einige minuten den server suchen muss ;-)
     
  7. #6 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    @shende danke für deine Antwort, das wusste ich nicht, das Problem ist jetzt halt: was nützt mir ein LanChat wenn es durch Firewalls sowieso zu Komplikationen kommt. Habe mal intensiver gegoogelt und das Problem trifft anscheinend häufiger auf, ohne ersichtliche Ursache. Ich denke ich sollte dann vielleicht doch komplett auf eine andere JAVA vorgehensweise umsteigen.

    @unplugged und chillikid, danke. Habe mal gegoogelt und eine interessante JAVA Libary gefunden: http://netresearch.ics.uci.edu/kfujii/jpcap/doc/ werde mir das ganze mal genauer anschauen :) Jedoch kann ich mit ARP noch nicht wirklich viel anschauen.
    @chillkid: hey das mit der Broadcast Adresse hatte ich mir auch schon überlegt(Hat mein Netzwerk Unterrich in der Berrufsschule doch was gebracht). werde mir das mal genauer anschaun vielleicht gibts da ne schnelle und einfache Lösung.

    @Darksun, ja das stimmt. Dass es so langsam ist wird natürlich noch über Threads optimiert. Der Codeschnipsel war ja zum Grundlegenden Testen geschrieben. Jedoch wie oben bereits geschrieben werde ich auf isReachable sowieso verzichten.


    Nochmals Danke an alle, ich werde euch auf dem Laufenden halten.
     
  8. #7 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Der wirkliche "ping" so wie man ihn kennt ist so in Java nicht implementiert. Dieses InetAddress.isReachable(int timeout) ist nur sowas ähnliches... - AFAIK

    Aber du kannst ja mal versuchen eine Socketverbindung mit den verschiedenen Rechnern aufzubauen. Wenn diese Socketverbindung erfolgreich hergestellt wurde kannst du davon ausgehen, dass der Client erreichbar ist.

    Gruß.
     
  9. #8 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    @shende, das habe ich gerade probiert gehabt, leider dauert das einfach viel zu lange ~4-5 Sekunden bis eine Exception geworfen wird. :(.

    Das JPCAP ist wohl auch nicht die richtige wahl, es wird nämlich ein Betriebsystem abhängige installation von JPCAP vorrausgesetzt damit das auch funktioniert.

    Ich versteh das das nicht, wie machen das PC Spiele zum Beispiel Quake3 da hat man innerhalb von bruchteilen das komplette Netztwerk nach Servern durchsurcht! ^^
     
  10. #9 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Das geht, wie schon erwähnt, mit dem Broadcast. Es ist die einfachste und effektivste Lösung.

    Das Programm, dass die Anderen aufspüren soll, nenne ich mal A. Die Anderen nenne ich B.

    A schickt eine Broadcast-Nachricht per UDP an einen bestimmten Port, bspw. 666
    Diese erreicht jeden Host im Subnetzwerk, also z.B. von 192.168.178.1-192.168.178.254

    Überall wo B läuft, muss auf Port 666 gelauscht werden. Wenn nun so ein Paket ankommt, schickt man eine Nachricht zurück und A weiß nun, dass dort das Programm B läuft.
     
  11. #10 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    bei normalen chatclients ist es doch so, dass der user wissen muss wo der server ist.
    wie im irc oder ähnlichem. die lösung wäre am einfachsten.

    ansonsten wäre doch ne dyn dns noch ne lösung.
     
  12. #11 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Aber eher nicht im privaten Netzwerk, denn er will ja einen "Lan-Chat" entwickeln. DynDns macht da außerdem auch keinen Sinn.
     
  13. #12 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Das mit dem Broadcast ist mir schon klar, nur ist dies mit JAVA nicht möglich. Diesen sogenannten ARP-Request (korrigiert mich jemand falls ich falsch informiert bin :) ) kann man nicht mit JAVA (nativ) ausführen.
     
  14. #13 29. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    ARP-Requests haben mit dem Broadcast gar nichts zu tun. Das musst du falsch aufgeschnappt haben.

    ARP-Requests werden für ganz andere Dinge benutzt und sind eher eine unschöne Notlösung in dieem Fall (Warum das hier jemand vorgeschlagen hat, ist mir schleierhaft).

    Eine Broadcast-Nachricht ist ein ganz normales Paket, nur dass es an die Adresse x.x.x.255 geschickt wird. Dieses erhalten dann alle PCs dieses Subnetzwerks.
     
  15. #14 30. Dezember 2009
    AW: IP Adresse im Netzwerk erreichbar

    Achso danke dir :D


    Hab jetzt endlich ne Lösung gefunden (ich hoffe da krätscht mir jetzt nichts mehr dazwischen :D ).
    Und zwar über Datagramme und Multicastings (MultiSockets)...
    Habe das ganze so verstanden dass sich der Client einer Multicast Gruppe (230.0.0.1) zuordnen lässt. Anschließend kann man allen Clients in dieser Gruppe Nachrichten schicken. Ganz ohne Server und ohne die IPs zu der Clienten wissen. Juhu^^

    Quellen:
    DatagramSocket&nbsp;&laquo;&nbsp;java.net&nbsp;&laquo;&nbsp;Java by API
    Lesson: All About Datagrams (The Java&trade; Tutorials Custom Networking)
    https://rz-static.uni-hohenheim.de/anw/programme/prg/java/tutorials/javainsel4/javainsel_16_012.htm#Rxx365java16012040006381F043100

    Quellcode:

    Empfänger:
    Code:
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    
    public class ReceiveMainClass {
    
     public static void main(String args[]) {
     try {
     MulticastSocket socket = new MulticastSocket(4447);
     DatagramPacket packet;
    
     InetAddress group = InetAddress.getByName("230.0.0.1");
     socket.joinGroup(group);
    
     while (true) {
     // Auf Anfrage warten
     packet = new DatagramPacket(new byte[65536], 1024);
     socket.receive(packet);
    
     // Empfänger auslesen
     InetAddress address = packet.getAddress();
     int port = packet.getPort();
     int len = packet.getLength();
     byte data[] = packet.getData();
    
     System.out.println("Anfrage von " + address + " vom Port "
     + port + " Laenge " + len + "\n"
     + new String(data, 0, len, "UTF8"));
     }
     } catch (Exception e) {
     e.printStackTrace();
     }
     }
    }
    
    Sender:
    Code:
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    
    public class SendMainClass{
    
     public static void main(String[] args) {
    
     try {
     MulticastSocket socket = new MulticastSocket(4446);
     String data = new String("Hallo Welt! RaidRush");
     
     byte[] buffer = data.getBytes("UTF8");
    
     socket.send(new DatagramPacket(buffer, buffer.length , InetAddress.getByName("230.0.0.1") , 4447));
     System.out.println("Sending a packet...");
     
     } catch (IOException e) {
     e.printStackTrace();
     }
     }
    }
    

    Danke nochmals ohne euch wäre ich nie soweit gekommen :D- jetzt gehen BWs raus^^
     

  16. Videos zum Thema
Die Seite wird geladen...
Similar Threads - Java Adresse Netzwerk
  1. Antworten:
    0
    Aufrufe:
    3.538
  2. Antworten:
    7
    Aufrufe:
    3.773
  3. Antworten:
    0
    Aufrufe:
    3.793
  4. Antworten:
    6
    Aufrufe:
    3.095
  5. Antworten:
    2
    Aufrufe:
    1.282