Alle benutzen IP-Adressen im LAN auslesen

  • Ich habe vor das gesamte lokale Netzwerk nach einem Webserver zu scannen. Dies funktioniert auch soweit, dauert aber sehr lange, wenn viele Ip-Adressen im Subnetz sind.


    Derzeit löse ich mein Problem damit, dass ich mir durch die Subnetzmaske und die Ip-Adresse des Clients alle möglichen Ip-Adressen im Netz berechne.

    Danach versuche ich eine Verbindung zu dem Client aufzubauen und schaue, ob diese zu Stande kommt. Das sieht dann in etwa so aus.

    Dies passiert für jede mögliche Ip-Adresse.


    Gehen wir davon aus, dass ich in einem /21 - Netz bin. Dann habe ich schon mal 2046 Adressen, die ich anpingen muss. Das ganze mal dem Timeout von 1500ms mach dann so ~ 51 Minuten(!).

    Da das zu lange ich, versteht sich glaube ich von selbst.


    Meine Idee war nun, vielleicht durch die Broadcast-Adresse alle benutzen Ip-Adresse nur zu testen. Laut IEEE müssten ja dann alle Clients eine Antwort zurückgeben.

    Jetzt ist nur meine Frage, wie ich das in Java umsetzen kann. Ich habe nun schon seit ein paar Stunden im Netz gesucht, aber keine passende Antwort gefunden.


    Vielleicht habt ihr aber auch noch eine andere Idee, wie man das Lösen kann? Irgendwie bekommt Minecraft das ja auch mit den Lokalen Servern hin...


    Danke schon im Voraus!


    // EDIT: Ach ja, und den Timeout zu reduzieren ist keine Alternative.

  • Was ich dir als erstes ans Herz legen würde ist, dass du auf jeden Fall Multithreading nutzt. Damit verteilst du den Workload auf mehrere Threads, die ihn dann gleichzeitig abarbeiten können. Ist jedoch Hardware abhängig wie viele Threads da dann sinn machen.


    Dann würde ich dir auf jeden Fall noch Nmap ans Herz legen. Das ist ein Tool, welches für genau deine Zwecke genutzt wird und in der Netzwerk-Admin Szene weit verbreitet ist (zwar nicht immer direkt erkennbar aber doch meist irgendwo im Hintergrund). Das interessante für dich könnte hier die Doku sein. Die geben gute Informationen wie sie die Anforderungen bewältigen. In deinem Fall erstmal Host Discovery (um rauszufinden, welche Geräte überhaupt online sind): https://nmap.org/man/de/man-host-discovery.html


    Dann haben sie ebenfalls eine gute Doku über ihre Port-Scanning Methoden: https://nmap.org/man/de/man-port-scanning-techniques.html


    Ein Blick auf die englischen Versionen der Dokumentationen bringt eventuell nochmal zusätzliche Informationen.

  • Danke erstmal für deine Antwort Floppy012 .

    Multithreading habe ich natürlich schon benutzt, was jedoch auch nur teilweise einen Performanceschub bringt. Da ich mit Android entwickel, bin ich natürlich sehr auf die kleinen Prozessoren der Mobilgeräte angewiesen und begrenzt. Und diese haben natürlich nicht die Kapazitäten x Thread aufzumachen, die dann auch noch parallel laufen.


    Namp habe ich mir tatsächlich auch schon während meiner Recherche angeschaut. Dort wird aber im Prinzip das selbe gemacht, wie bei mir. Nur dass die halt dort mit den SYN/ACK Paketen arbeiten.

    Das ist in Java aber leider nicht möglich. (siehe Stackoverflow)


    Ich bin aber dennoch gerne für weitere Inspirationen offen.