# Broadcast - senden eines Packetes an alle rechner im netz



## angelchr (8. Nov 2007)

hallo zusammen!!!

nach erfolgloser suche bei google & co hab ich mich entschlossen bei den spezialisten hier im forum nachzufragen.

Mein Problem:

Eine Client Server Applikation, bei der der Server auf einen bestimmten port "horcht" nun soll der Client ALLE "horchenden" Server im Netz-Segment finden und auflisten. Dannach kann ein Server ausgewählt werden.


Mein Lösungsansatz:

- ermittlung der IP
- ermittlung des Netzes 
- senden eines UDP Packetes an alle rechner im Netz auf dem Port auf dem der Server horcht.
- wenn der Server etwas mit dem Packet anfangen kann, schickt er eine Antwort.


Mein Probelm:

Ist es  möglich eine art Broadcast zu veranstalten? also eine anfrage an zb 192.168.1.255 auf Port X ?
Wenn Ja wie mach ich das?


Ich freue mich auf die Antworten


Gruß Angelchr


----------



## HoaX (8. Nov 2007)

nim einfach die 255.255.255.255, die sendet dann einen broadcast in alle direkt erreichbaren netze. analog zur adresse 0.0.0.0 an der du deinen server lauschen lassen kannst, dann kannst auf allen ips empfangen die der rechner hat.

oder was meinst du mit 





> Ist es möglich eine art Broadcast zu veranstalten? also eine anfrage an zb 192.168.1.255 auf Port X ?
> Wenn Ja wie mach ich das?


einfach hin senden und gut is!


----------



## angelchr (8. Nov 2007)

also versteh ich das richtig ich mach nen serversocket auf 0.0.0.0 auf.
und wie schick ich die anfrage an den "möglichen" server ? mit datagramSocket oder mit Streamsocket ? Haste vielleicht ein bsp ??
Danke

Gruß

Angelchr


----------



## HoaX (9. Nov 2007)

angelchr hat gesagt.:
			
		

> also versteh ich das richtig ich mach nen serversocket auf 0.0.0.0 auf.


ja, außer du willst nur auf einer bestimmten ip lauschen ...



			
				angelchr hat gesagt.:
			
		

> und wie schick ich die anfrage an den "möglichen" server ? mit datagramSocket oder mit Streamsocket ? Haste vielleicht ein bsp ??


 da mir nicht bekannt ist dass java von haus aus einen StreamSocket hat, würe ich sagen ganz normal mit DatagramSocket.
ein beispiel zu schreiben bin ich jetz zu faul, die api von DatagramSocket ist nun aber auch wirklich nicht schwer. sicherlich lesenswert für dich ist http://java.sun.com/docs/books/tutorial/networking/index.html


----------



## louis (9. Nov 2007)

Kleine Info: leider antworten nicht alle Betriebssysteme auf einen IP Broadcast. Meines Wissens nach z.B. Windows in der Grundeinstellung gar nicht.

mfg Louis


----------



## Gast (9. Nov 2007)

Ich würde das so lösen, dass du zuerst die IP des lokalen Netzes erfragst und die Subnetzmaske.

SM: 255.255.255.0
Netz: 192.168.1.0

Und dann versuchst für jede IP einen Dienst mit Port zu binden. Kann der Dienst gebunden werden existiert logischerweise keiner für die IP-Port kombination.


----------



## tuxedo (9. Nov 2007)

Da hatten wir schon das Problem dass das nicht schnell genug geht. Hintergrund: Windows lässt per Default nur 10 gleichzeitige Verbindungen zu. Muss man also erst anpassen bevor man recht schnell "suchen" kann.

- Alex


----------



## Gast (9. Nov 2007)

Dann muss man halt nach jedem verindungsaufbau ihn gleich wieder schließen.


----------



## tuxedo (9. Nov 2007)

Ja, das schon... Nur wenn du einen 192.168.0.x Bereich durchsuchen willst und zwischendrin Timeouts auftreten, dann dauert das halt doch etwas lange. Auch wenn man die Timeouts auf nur 1 oder 2 Sekunden runterschraubt: Je mehr Anfragen ein Timeout produzieren, desto länger dauert's. Im Worstcase in diesem Fall dann 254 * "TimeOut" .. Und bei 1 Sekunde macht das schon über 4 Minuten ... Und wenn man dann nur 10 Verbindungen gleichzeitig testen kann wird's doof. Weil dann bremst das ungemein. 

- Alex


----------



## Niki (9. Nov 2007)

Hast du dir schon den MulticastSocket angeschaut? Der könnte doch genau das sein was du brauchst. Innerhalb eines Segments funktioniert das. Ich habs schon mal ausprobiert.


----------



## angelchr (9. Nov 2007)

ich danke schon mal für die vielen antworten. Damit hab ich schon mal einen einblick in die Thematik. Allerdings frag ich mich dann wie das andere Programme machen. Vor allem Spiele. Nehmen wir mal als Bsp. das gute alte Counter-Strike. Szenario: Ich bin auf einer LAN-Pary klick da auf LAN-Game (ging das so???) dann werden mir da alle Server aufgelistet. Wie um alles in der Welt wird das gemacht, wenn da ein ganzes Netz durchsucht wid? Das mit den 254*Timeout klingt schon logisch aber das hat doch nie so lange gedauert. Mein Ziel ist es genau so eine Applikation zu erstellen.

Angelchr


----------



## tuxedo (9. Nov 2007)

Ich weiß nicht genau, aber ich vermute mal, dass solche Spiele ein wesentlich geringeres Timeout nutzen. Im LAN sind die Antwortzeiten so gering, dass man das Timeout sicher auch 100 Millisekunden runterdrehen kann.
Da wird das ganze dann nautürlich schon schneller.

Im Worst-Case wären das dann, wenn immer 10 gleichzeitig überprüft werden können, etwa:

254 / 10 * 0,1sek = 2,54 Sekunden

Nimmt man 1 Sekunde timeout an, so wäre man bei 25,4 Sekunden. Auch das wäre sicher noch "okay". Sollte man dann halt wenigstens ne ProgressBar einblenden um dem Testfortschritt anzuzeigen.

Das ganze wurde wie gesagt schonmal diskutiert:

Musst hier mal im Forum suchen ob du den Thread wieder findest. Ging um Portscanner mit Java. Der zu testende Port war glaub 10.000. Vielleicht findest du den Thread ja. Hab ihn jetzt auf die schnelle nicht gefunden. 

- Alex

[update]

gefunden:
http://www.java-forum.org/de/viewtopic.php?t=56081&highlight=port+10000
http://www.java-forum.org/de/viewtopic.php?t=56549&postdays=0&postorder=asc&start=0


----------



## Gast (9. Nov 2007)

Es ist ja auch so dass ein Spiel meines erachtens nicht alle Ports nutzt sondern nur bestimmte (oder sogar nur einen). Bei 254 möglichen IP Adressen sieht die rechnung dann so wie rchtigerweise von alex gepostet aus.

Die Thematik eines Portscanners ist aber anders, da für eine IP sämtliche Ports durchgegangen werden und nicht wie bei CS, für einen Port, alle IPS im Netz. Das verringert die Zeit enorm.

ich denke eh, dass das ganze anders läuft. Ich z.B. würde für den Server einen Namensdienst registrieren, sodass man nur nach einen Nmanesdienst für den Rechner fragen muss (siehe RMI)


----------



## HoaX (9. Nov 2007)

louis hat gesagt.:
			
		

> Kleine Info: leider antworten nicht alle Betriebssysteme auf einen IP Broadcast. Meines Wissens nach z.B. Windows in der Grundeinstellung gar nicht.
> 
> mfg Louis



was du meinst ist ein broadcast-ping. normale udp broadcasts sollten überall durch gehen.




			
				Gast hat gesagt.:
			
		

> Ich würde das so lösen, dass du zuerst die IP des lokalen Netzes erfragst und die Subnetzmaske.


 nur blöd dass man mit java nicht einfach so die subnetmasken herausbekommt.


für jedes normale heimnetz sollte auf 0.0.0.0 lauschen und an 255.255.255.255 senden funktionieren.

lan-spiele machen auch nur einen broadcast.


----------



## anfänger15 (9. Nov 2007)

Bei Counter-Strike kenn ich mich nicht so aus aber z.B. Battlefield(auch andere) benutzt einen Namesserver und bei dem Server melden sich dann alle Server an und sagen hallo ihr könnt mich unter ... erreichen. Die Clients fragen dann beim Namensserver nach und der schickt ihnen dann eine liste mit allen Servern die mommentan laufen.


----------



## angelchr (11. Nov 2007)

Vielen Dank leute Ihr habt mir echt weiter geholfen.
Mit diesen Ansätzen kann ich jetzt mal an die arbeite gehen. 
Also vielen Dank nochmal an alle die hier mitgewirkt haben. 

Gruß

Angelchr


----------

