# Network Broadcasting



## maximilian009 (8. Jul 2011)

Hi,
ich möchte, dass sich 2 Instanzen von meinem Programm die mit irgendeinem Netzwerk miteinander verbunden sind gegenseitig finden.
Bisher hab ich immer die IP-Adresse eingeben müssen. Das soll sich jetzt ändern.
Ich hab schon einen Plan, der in etwa so aussieht, dass ich mir die IP-Adressen der Netzwerkverbindungen irgendwie auslese. Dann nehme ich die ersten 3 der 4 teile und hänge eine 0 hinten dran (192.168.178.0)
Auf dieser IP mache ich alle 3-5 sekunden einen ServerSoket auf und sende eine bestimmte ID für ne bestimmte Aktion(Austausch der IP-Adressen und so) mit.
Ich habe schon einen NetListener (kein Listener-Modell, der macht nur einen Socket auf und versucht zu akzeptieren) der dann die Incoming Transmission handled.

Meine Frage ist jetzt ob das mit der InetAddress geht dass der ServerSocket dann an alle möglichen geht und wie ich die EIGENE IP-Adresse der verschiedenen Netzwerkverbindungen (Hamachi, Tunngle, LAN, WiFi) von den Computer (Mac und PC und evt. Linux) auslesen kann.

Danke schonmal für die Hilfe!
Max


----------



## Kr0e (8. Jul 2011)

1. Dafür benutzt man eigentlich nicht TCP sondern UDP

UDP unterstützt quasi direkt eine Broadcasting Addresse. DAs mit alle 3-5 Sekunde ServerSocket aufmachen hört sich sehr strange an!

Es ist eigentlcih super simpel: Server-Programme können einfach über diese Broadcasting-Addresse sich selbst im Netzwerk bejkannt machen... Das einzige was dafür genormt sein muss, ist der Port.
Sprich generell senden deine Server-Instanzen UDP-Pakete auf Port ka.. 1337  Also dann wäre deine ServerMessage: Addresse: 0.0.0.0 (Broadcast) auf Port: 1337. Alle potenziellen Clienten müssen fianch nur nen UDP Socket auf Port 1337 binden und schauen, obs ankommende Pakete gibt...

Das ganze geht auch umgekehrt! (So machen es normaleweise die Gameserver...) Die Clienten senden nen Broadcast und die Server horchen obs Pakete gibt. Wenn ein Client dann quasi ne Anfrage sendet, schickt der Server ein Paket mit dem Inhalt SEINER TCP ADDRESSE (Wichtig!) zurück und - voila!

Gruß,

Chris


----------



## Empire Phoenix (8. Jul 2011)

Und bitte bitt bau einen direct ip connect ein, jeder der geren C&C generals gespielt hat kennt das, (ich sehe spieler 2 der aber nur 3 und 4 die sehen zwar mich aber dafür spieler 5 nicht und spieler 6 sieht nimand) 
Das problem ganz simple, boardcasts sind solange toll wi es sich um ein echtes Lan handelt (idealerweise mit hub) da router garantiert boardcasts aussortieren und switches das evtl tun könnten.

(Wenn es sich hierbei nciht um ein Lobbysystem für ein Spiel handelt ignoriere diese post einfach)


----------



## Kr0e (8. Jul 2011)

Braodcast geht sogar über hamachi =) Aber stimmt shcon, Direct-Connect ist Pflciht


----------



## maximilian009 (8. Jul 2011)

Es geht eigentlich darum, dass ich Dateien über Netzwerk versenden kann.
Weil das mit Mac und PC usw halt nicht grade das einfachste ist habe ich mir gedacht, dass es doch garantiert toll wäre, sowas zu schreiben.
Ich bastel jetzt seit einer Woche an der GUI und will jetzt die Funktionalität mit rein bringen, die vorher nur auf einer TestGUI mit 2 JTextFields für IP und DateiPfad existent war.
Das Dateien versenden geht auch soweit schon.

Für die ganz neugierigen:
Ich hab dann vorgestern mal das Problem gehabt, dass mein Kumpel noch auf meinem Minecraft-Server spielen wollte obwohl ich ins Bett gehen wollte. Die Lösung: alles unwichtige löschen und bei einem Server-Socket auf einem bestimmten Port (42424) (ich mag die zahl 42^^) wird ein exec() aufgerufen, dass den Befehl shutdown -s -f ausführt. Hat auch geklappt. Mir kam dann nur die Idee, dass doch auch garantiert ein ServerSocket aufgemacht wird, wenn man eine Internet-Seite aufruft. Der Test: Ich gebe in meinem iPhone-Browser die IP meines Computers in Hein WLan Netzwerk ein mit :42424 am ende und auf Knopfdruck fährt sich der Pc runter...

Weiter im Thema:
(Ich habe an dieser Stelle tatsächlich vergessen was ich nach dem Einschub noch schreiben wollte)
Naja auf jeden Fall soll halt die Möglichkeit bestehen, dass man sich gegenseitig findet, z.B. an der Uni wenn man im selben WLan Netzwerk ist. Sowas ist mir wichtig. 
Und nach dem was ich grade über C&C gelesen habe hab ich fast angst, dass das nicht mit UDP geht.
Oder, korrigiert mich bitte wenn ich falsch liege, hat das damit nichts zu tun?
Es sollen nun mal alle Leute in allen Verbundenen Netzwerken gefunden werden, die das Programm am laufen haben, egal ob WLan, Lan, Hamachi oder Tunngle oder so. 
Und wenn ich alle IP-Adressen in einer while(true)-schleife durchgehen muss
(ein durchlauf dauert, wenn man von einer Dauer/IP von 20ms ausgeht ca 2.5 Tage!!)
... nein, dass ist dann doch keine Lösung.

keine Ahnung wie ich das machen soll, wenn UTP nicht zuverlässig ist und ich nicht 3 Tage warten will bevor ich jemanden in der Netzwerkübersicht sehe...

EDIT:
natürlich wird es auch DirectIP geben, nur es soll ja um Komfort bei der ganzen sache gehen, und darum dass man sich nicht mehr über sowas ärgern muss...


----------



## Kr0e (8. Jul 2011)

1. Dein Browser macht kein ServerSocket auf, wenn er ne Seite lädt... 

Also 101: ein ServerSocket horcht auf einem port. Wenn nun ein Socket kommt und sagt "hey, was geht ab, ich will connecten und so..." dann sagt der ServerSocket "Jo, wart ma, ich öffne auch mal nen Socket und dann könnt ihr beide schön Händchen halten" ... "Ok, sagt der Anfangssocket".

Also bei einem Verbindungsaufbau sind strenggenommen 3 Socket beteiligt. Ein ServerSocket und die beiden anderen Sockets, die jeweils auf ihren Ausgangsrechnern laufen. 

In deinem Fall: Der WebServer macht einen ServerSocket auf! Und der Browser connected über Port 80 und bekommt nen Kumpel-Socket vom Server. Die können dann quatschen 

So, und UDP ist GENAU was du suchst, erläutere bitte, was du mit unzuverlässig meinst... Bei UDP können Pakete verloren gehen, ja. Aber das passiert selten (utner Volllast) und zur Not schickt man so lange UDP Pakete in 5 Sekunden abständen, bis endlich mal ein Server antwortet...

EDIT: Achja, es können nur PCs im Lan gefunden... Hamachi etc emuleiren ja ein LAN wodurch es dort auch klappt... Du kannst also nciht PCs im Internet finden...


----------



## maximilian009 (8. Jul 2011)

Empire Phoenix hat gesagt.:


> Und bitte bitt bau einen direct ip connect ein, jeder der geren C&C generals gespielt hat kennt das, (ich sehe spieler 2 der aber nur 3 und 4 die sehen zwar mich aber dafür spieler 5 nicht und spieler 6 sieht nimand)
> Das problem ganz simple, boardcasts sind solange toll wi es sich um ein echtes Lan handelt (idealerweise mit hub) da router garantiert boardcasts aussortieren und switches das evtl tun könnten.



Deswegen habe ich das grade mit UTP gedacht. Nur wenn du sagst dass das geht, dann lese ich mir mal was dazu durch und versuchs einfach mal...

Geht der Broadcast dann auf wirklich alle verbundenen Netzwerke?

Und wie kann ich für TCP die Netzwerkverbindung herausfinden, über die dass dann laufen soll?

Beispiel:
Ich hab Hamachi offen und bin über WLan verbunden.
Wenn jetzt der Broadcast kommt, dann weiß ich ja dass da jemand ist, aber nicht von welcher Netzwerkverbindung aus. Soll ich als empfänger des Broadcast jetzt die vom WLan oder die von Tunngle zurückgeben, fragt sich der Server dann...


----------



## Kr0e (8. Jul 2011)

Schau mal:

Wenn der Client nen Broadcast sendet... Dann antworten in der Regel alle verfügbaren Server. Diese Server schicken einfach nur Ihre IP + port. Die IP+Port bekommen diese Server dnan von ihren ServerSocket mit der Funktion ServerSocket.getInetAddress(). Diese Daten packen die Server in ein UDP-Packet und senden es an den Clienten zurück. FRAGE: Woher wissen die Server die Adresse des Clienten ? 'Nun, im Datagram (So heißt das Packet, das man mit UDP Sockets verschicken kann (Lese hierzu bitte einfach die Doku )) steht die ursprungadresse...

So und das wars, ansich ne recht simple Geschichte


----------



## maximilian009 (11. Jul 2011)

Kr0e hat gesagt.:


> Schau mal:
> Die IP+Port bekommen diese Server dnan von ihren ServerSocket mit der Funktion ServerSocket.getInetAddress().
> So und das wars, ansich ne recht simple Geschichte




Und was ist wenn der Server mehrere Netzwerkverbindungen hat, die alle unterstützt werden sollen?
(e.g Hamachi, Tunngle, LAN und WLAN)???
Vergiss das, das hab ich schon gelöst!

Wie muss die InetAddress aussehen, wenn die auf alle in einem Netzwerk gehen soll?
Beispiel: meine Hamachi-IP ist 5.93.236.190. die von der gegenstelle ist 5.161.37.234.
Kann ich jetzt im Hamachi-Netzwerk einen Broadcast losschicken indem ich den an 5.0.0.1 oder so sende oder wie geht das??
der soll ja alle mit der 5 vorne dran erreichen. 

Und das mache ich dann für alle netzwerke mit denen der Computer verbunden ist.


----------



## Kr0e (19. Jul 2011)

Keine Ahnung, ob dieser Thread noch aktis ist, aber:

Meines Wissens ist die Broadcast ADresse 255.255.255.255 und damit erreichst du alles, was im Lan ist, egal ob Hamachi oder sonst was.


----------

