3 Stimmen

Wie erhalte ich mit Java alle Systemnamen, die mit dem LAN verbunden sind?

Ich möchte, dass alle Systeme in einem LAN verbunden werden? Kann mir jemand einen Vorschlag machen?

2voto

Chad Punkte 2833

Das Paket, das ich dazu in Java verwendet habe, heißt jcifs. Hier ist der Link zum Bibliothek .

Bitte beachten Sie: Um einen Rechner in einem Subnetz zu identifizieren, müssen Sie alle verfügbaren IP-Adressen in diesem Subnetz anpingen. Von dort aus können Sie einen Reverse-IP-Adress-Lookup durchführen, um die Details des Rechners zu erhalten.

Soweit ich mich an das OSI-Modell erinnere, ist der Grund, warum Sie alle Rechner im Netz anpingen wollen, der, dass ICMP immer noch die unterste Schicht im OSI-Modell ist. Allerdings kann man sich nicht darauf verlassen, dass ICMP-Anfragen (ping) an alle Rechner im Subnetz gesendet werden. Der Grund dafür ist, dass die meisten Windows-Rechner dieses Protokoll blockieren, um Fishing-Angriffe zu verhindern. Daher müssen Sie stattdessen einen zweistufigen Erkennungsansatz wählen. Zunächst wird eine ICMP-Ping-Anfrage über die IP-Adresse des Subnetzes gesendet. Nach der ICMP-Ping-Anforderung warten Sie 1 Sekunde und führen dann eine SMB-Verbindung zu den nicht antwortenden IP-Adressen durch. Sie werden feststellen, dass die meisten Benutzer entweder einen gemeinsam genutzten Drucker oder ein Microsoft-Netzwerk haben, das auf eine Anfrage über diesen Port reagiert.

Die Alternative ist die Verwendung eines NetBios Reverse Name Lookup, wobei allerdings der IP-Adressbereich des Subnetzes gespammt werden muss.

Ich hoffe, das hilft.

0voto

MarkR Punkte 60862

Warum wollen Sie sie, und warum müssen es Namen sein? Nicht alle Systeme haben einen Namen.

Welche Art von Systemen wollen Sie aufzählen?

Wenn Sie versuchen, Instanzen Ihrer eigenen Anwendung in der Nähe zu finden, verwenden Sie Multicast-UDP, um ein Erkennungsprotokoll zu erstellen.

Wenn Sie versuchen, einen Server zu finden, der ein eigenes Protokoll für diesen Zweck hat, dann verwenden Sie dieses.

0voto

Stephen C Punkte 665668

Wenn ich versuchen würde, dies in Java zu implementieren, würde ich eine ungenutzte TCP/IP-Portnummer wählen und dann versuchen, einen Socket zu jeder IP-Adresse im IP-Adressbereich des LAN zu öffnen. Sie erwarten, dass alle Verbindungsversuche fehlschlagen, aber sie sollten auf unterschiedliche Weise fehlschlagen, je nachdem, ob ein Rechner die IP-Adresse verwendet. Wenn eine IP-Adresse in Gebrauch ist, sollten Sie die Meldung "Verbindung verweigert" erhalten. Wenn sie nicht verwendet wird, sollten Sie die Meldung "no route to host" oder "no route to network" erhalten. Ein "connect timed out" kann darauf hindeuten, dass der Host durch eine Firewall geschützt ist oder dass er vor kurzem noch aktiv war, aber im Moment nicht mehr aktiv ist.

Ein anderer Ansatz (von dem ich nicht weiß, ob er in Java möglich ist) besteht darin, ARP-Anfragen für jede IP-Adresse im Netzwerkadressbereich zu senden und zu sehen, was im ARP-Cache Ihres Computers auftaucht.

Natürlich können Sie auch versuchen, ICMP-Ping-Nachrichten zu senden, aber diese können von einer Firewall blockiert werden.

Sobald Sie eine Liste der aktiven IP-Adressen haben, verwenden Sie DNS Reverse Lookup, um die entsprechenden DNS-Namen zu finden. Beachten Sie jedoch, dass nicht alle IP-Adressen an DNS-Namen gebunden sind.

Allerdings ist dies alles etwas unsicher, da viele Rechner und Netzwerke Firewalls verschiedener Art verwenden, die Netzwerknachrichten verwerfen oder irreführende Antworten senden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X