C++ Serversuche via Broadcast

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.058
Hey Leute,

ich habe aktuell vor einen Server auf meinem Rechner laufen zu lassen, welcher mit meinem Handy (App) kommuniziert.
Nun möchte ich das etwas flexibler machen, sprich dass mein Handy automatisch den Server findet bzw. eine Serverliste generiert, mit allen Rechnern im Netzwerk, wo mein Server drauf läuft.
Ich habe mir das so gedacht, dass die App 3 UDP Broadcast Pakete mit spezieller Signatur rausschickt (an 255.255.255.255) und alle Server mit einer bestimmten Syntax antworten, so dass der Client die Adressen und die Ports der Server hat.
Nun wollte ich wissen, ob das was ich vor habe möglich ist, ohne einen festen Port für den Server festzulegen. Würde ich meinem Server den UDP Port 23151 geben, dann würde das ganze ja nur funktionieren, wenn noch kein anderes Programm diesen Port hat und ich möchte das jetzt nicht den Zufall überlassen (würde der Port belegt sein und man stattdessen 23152 nehmen, dann müsste dies der Client ja auch wissen).
Gibt es einen Broadcast Port bzw. muss man bei einer Broadcast Nachricht überhaupt einen Port angeben?


Wie kann ich das regeln?


Gruß
T
 
Der einfachste Weg wäre wohl ein Broadcast vom Server mit dem er sich announced. Da kann er dann den Port mitteilen.
Ein schönerer Weg wäre Zeroconf zu verwenden, das macht im Endeffekt das gleiche, dort können sich dann services eintragen, die dann dem Netzwerk mitgeteilt werden (z.B. "ich kann drucken!"). Der Client müsste dann auf diese Advertisments reagieren.

Edit: Ich weiß nicht, welche Plattform du anpeilst, hier ist beschrieben, wie man in C++ mit Avahi arbeitet (habe das selbst nur überflogen). Für den mobilen Part sollte es entsprechende Libraries geben.
 
Zuletzt bearbeitet:
Nein, das funktioniert anders (in beiden Ansätzen, nur einmal selbstgebaut und einmal über eine library):
- Der Server gibt periodisch dem gesamten Netzwerk Bescheid, dass er deinen service anbietet und wo der zu erreichen ist (IP+Port)
- Dein Client kann dann auf die Mult-/Broadicast Adresse horchen und erhält die Nachrichten. Dann weiß er wo der Server steht.

Alternativ kannst du natürlich auch den Client im Netzwerk fragen lassen worauf der Server dann antwortet. Dann musst du aber den Port kennen und du könntest kein Zeroconf verwenden.

Edit: Das Problem scheint ja der Port zu sein: da kannst du dir eigentlich relativ sicher sein, dass der frei ist, wenn du dir keinen ausguckst, der von einem anderen Programm schon belegt ist.
 
Zuletzt bearbeitet:
NemesisFS schrieb:
Edit: Das Problem scheint ja der Port zu sein: da kannst du dir eigentlich relativ sicher sein, dass der frei ist, wenn du dir keinen ausguckst, der von einem anderen Programm schon belegt ist.

Eben das ist das Problem. Das selbe Problem existiert auch, wenn man es andersrum macht, wie du es beschrieben hast, nur dass dann der Client das Portproblem hat und nicht der Server.

Ich möchte nicht einfach darauf vertrauen, dass mein Port nicht benutzt wird, sondern ich will Gewissheit, kann ja immer sein, dass der Benutzer (sofern ich dies nicht sein werde) bereits ein anderes Programm laufen hat, was zufälligerweise den selben Port benutzt. In diesem Fall müsste man die Änderungen sowohl in einer Konfig am Server, als auch am Client (App) vornehmen, was ich etwas zu umständlich finde...
 
Henne-Ei-Problem. Irgend so eine Art Name-Service wirst du immer brauchen, also einen Server (mit bekannter Portnummer), an dem alle anderen Server sich registrieren, und an dem Clients die genauen Adressen der diversen Sever abfragen.
 
Tockra schrieb:
Ich möchte nicht einfach darauf vertrauen, dass mein Port nicht benutzt wird, sondern ich will Gewissheit, kann ja immer sein, dass der Benutzer (sofern ich dies nicht sein werde) bereits ein anderes Programm laufen hat, was zufälligerweise den selben Port benutzt.
Die wirst du nicht haben können, solange du nicht alle Ports durchprobierst (und damit vermutlich das Netzwerk lahm legst).

Wenn du die eh schon sehr kleine Wahrscheinlichkeit, dass ein hoher Port wie 23151 schon benutzt wird, kannst dir ja z. B. drei Ports (mit jeweils Abstand voneinander) wählen, die der Client oder der Server (je nach dem wie rum du es machst) durchprobiert. Der Client muss sich dann nur merken, welcher Server welchen Port benutzt. Damit hast du zwar drei Broadcasts, aber eben die Konfliktwahrscheinlichkeit gedrittelt.

Eine Einstellung um den Serverport manuell fest zu legen, sollte es am Client aber trotzdem geben.
 
Avahi würde die Portproblematik lösen, dann kannst du ja einen beliebigen wählen und der wird dann dem Client mitgeteilt.
Eine andere Möglichkeit wäre, Fallback Ports zu verwenden, falls auf dem ersten nichts gefunden wird (Hier müllst du dann aber das Netzwerk zu, in 99% der Fälle wird einfach kein Server da sein, statt einer dessen Port belegt ist).

Die einfachste Variante sich wäre, sich wegen eines Szenarios das ohnehin nicht Eintritt sich nicht so einen Kopf zu machen.
 
Der Client verbindet sich doch zum Server, oder? Da hat der Client keinen expliziten Port, der wird zufällig gewählt.
Du hast eine Verbindung zwischen client:XXXXX und server:1234 (wenn 1234 der entsprechende Port ist)
 
Zurück
Oben