Socket Problem?

Status
Nicht offen für weitere Antworten.

nO-0n3

Mitglied
Guten Abend!

Bevor ich genau auf das Problem eingehe kurz zum drumherum.

Ich möchte überprüfen, auf welchen Computern in einem Netzwerk, meine Anwendung läuft.
Meine Idee dazu: versuchen ein Socket zu dem bestimmten Port
(auf dem die Anwendung lauft) zu erstellen und wenn dies gelingt weiß ich das
dort das Programm drauf ist. So weit so gut.
Ich weiß nicht ob ich den richtigen Ansatz habe oder ob das schon am Ziel vorbeigeschossen ist.
Auf jeden Fall habe ich das ausprobiert und damit es möglichst schnell geht folgendermaßen realisiert:

Ich laufe in einer Schleife von 1-255 durch und baue immer eine verbindung mit
Java:
s.connect(new InetSocketAddress(ip,xxxx),50);
auf. Wobei xxxx der Port ist auf dem die Anwendung läuft und 50 das max Timeout.

So nun zum Problem:
(Annahme) auf meinem Rechner (10.0.0.59) läuft die Anwendung.
Wenn ich nun das Programm von 1-255 durchlaufen lasse bekomme ich bei jedem ein connect timeout.
Wenn ich es aber nur von 50-60 laufen lasse dann findet es den Server.
Ich habe dann ein bisschen herumprobiert
und immer wenn ich <=10 IP-Adressen suche kann es darunter die Server ausmachen, sobald ich mehr also 10 durchgänge mache findet es keinen.
Woran kann das liegen?

Zur Übersicht nochmal der vereinfachte Programmausschnitt:

Java:
for(int i=0;i<255;i++) {
  
   ip.replace(lastpos,ip.length(),""+i);
   if(lookUp(ip.toString())) {
      System.out.print(ip+": SERVER");
   }
   else System.out.println(ip+": nothing");
}

wobei lookUp so aussieht:
Java:
boolean lookUp(String ip) {
   boolean found;
   Socket s = new Socket();

   try {
      s.connect(new InetSocketAddress(ip,xxxx),50);
      found=true;
   }
   catch(IOException ioe) {
      found = false;
   }
   finally {
      try { if(s!=null) s.close(); }
      catch(IOException ioe) {
         System.err.println(ioe.getMessage());
      }
   }return found;
}

Die Ip-Adressen werden mit
Java:
ip.replace(lastpos,ip.length(),""+i);
alle richtig erstellt (10.0.0.1-255)

Ich hoffe ich konnte das Problem verständlich schildern und
freue mich auf baldige Rückmeldung.

mfg nO-0n3
 
Zuletzt bearbeitet:
(Annahme) auf meinem Rechner (10.0.0.59) läuft die Anwendung.
Zur deiner Annahme möchte ich dir nur mitteilen, dass der Port 2001 als Trojaner-Port bekannt ist.

Jegliche Hilfe, ein Programm zu entwicklen, was über diesen Port kommuniziert, kannst du von meiner Seite aus vergessen.

Falls du kein Schadprogramm schreiben willst, nimm einfach einen anderen Port und melde dich hier nochmals.
 
Wirklich? Oh ok.
Der Port spielt absolut keine Rolle dan nehmen wir halt 7352 oder xxxx es
ist vollkommen egal.

Zur Info es handelt sich dabei um einen RMI Server, aber das ist nicht so wichtig
da ich bei diesem Port auf einen Control Server zugreife der mit dem RMI Server gekoppelt ist.
Und dieser wartet mit einem einfachen
Java:
Socket s;
ServerSocket ss = .......
s = ss.accept();
auf eingehende Verbindungen.

Hoffe du bist jetzt bereit zu helfen.
 
So erledigt^^
Das editieren ist ganz schön trickreich oO

Dankeschön vielleicht fällt dir ja was ein.

EDIT:
Habe hier noch eine .txt angehängt mit einem compilier fähigem Programmteil.
 

Anhänge

Zuletzt bearbeitet:
Wurde leider nix in der Mittagspause, ich hab mir dein Problem nun eben mal kurz betrachtet und ein kleines Snippet runter getippt, wie ich an die Sache heran gegangen wäre (Code ist ungetestet, da erster Lösungsansatz aus dem Kopf).

Java:
try {
            //deine Netzwerkkarte
            NetworkInterface lvNetzwerkInterface = NetworkInterface.getByName("<name>");
            //alle IP's die mit dieser Karte verbunden sind, so habe ich das verstanden.
            Enumeration lvAddresses = lvNetzwerkInterface.getInetAddresses();
            Object lvObjekt = lvAddresses.nextElement();
            InetAddress lvAddress = (InetAddress) lvObjekt;
            //irgendeine der IP Addressen
            String lvFirstIP = lvAddress.getHostAddress();
            //Index des 3. Punktes finden
            Integer lvInteger = lvFirstIP.lastIndexOf( "." );
            //und die Broadcast IP basteln.
            String lvBroadcast = lvFirstIP.substring(0, lvInteger) + "255";
            //hier sollten alle Rechner im Netz antworten (hoffe ich)
            Socket so = new Socket(lvBroadcast, <deinPort>);
        } catch(Exception e) {}

Bin gespannt, ob das funktioniert.
 
Zur deiner Annahme möchte ich dir nur mitteilen, dass der Port 2001 als Trojaner-Port bekannt ist.

Jegliche Hilfe, ein Programm zu entwicklen, was über diesen Port kommuniziert, kannst du von meiner Seite aus vergessen.
jeglicher Wunsch von mir einen Job als Systemadministrator zu bekommen kannst Du mit der Einstellung vergessen ... da Du jegliches Programm installieren würdest was Port 80 verwendet ... http://www.iana.org/assignments/port-numbers ... dort ist der Port nicht als "Bad-Port" gelistet

Code:
//hier sollten alle Rechner im Netz antworten (hoffe ich)
Socket so = new Socket(lvBroadcast, <deinPort>);
Deine Hoffung verfliegt ... Du verwechselst hier TCP mit UDP

nO-0n3 hat gesagt.:
Ich habe dann ein bisschen herumprobiert
und immer wenn ich <=10 IP-Adressen suche kann es darunter die Server ausmachen, sobald ich mehr also 10 durchgänge mache findet es keinen.
Woran kann das liegen?
an Windows ... ich vermute das der GC nicht schnell genug den Socket aufräumt und Windows erklärt "das Limit ist noch nicht überschritten" ... Deine Klasse ist soweit richtig

hand, mogel
 
Schonmal danke für eure beiden Antworten.

Das Windows nicht mithalten kann habe ich fast befürchtet.
Und hat sich jetzt nach mehrer Versuchen auch bestätigt,
ab einer Wartezeit von ca. 1 sek zwischen den
Java:
lookUp()
Aufrufen findet er alle Server die im Netzwerk gestartet sind.
Aber das ist eindeutig zulang.

Hat jemand vielleicht eine Idee wie man das Problem anders lösen kann?
Vielleicht den GC sanft mitteilen schneller zu räumen?, oder überhaupt anders
nach den Server suchen?
 
Das Windows nicht mithalten kann habe ich fast befürchtet.
Und hat sich jetzt nach mehrer Versuchen auch bestätigt,
ab einer Wartezeit von ca. 1 sek [...] findet er alle Server die im Netzwerk gestartet sind.
danke ... Du bestätigst meine Vermutung

Vielleicht den GC sanft mitteilen schneller zu räumen?
glaube System.gc() oder so ... damit bittest Du den GC mal Aufzuräumen

Hat jemand vielleicht eine Idee wie man das Problem anders lösen kann?
[...]
oder überhaupt anders nach den Server suchen?
die Idee von neonfly ist dafür geeignet ... mach Dich mal zum Thema Broadcast schlau

hand, mogel
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben