Ich habe eine Bibliothek für die rein plattformübergreifende Programmierung erstellt. Meine damit erstellten Spiele laufen einwandfrei unter Android, PC, Linux, Mac usw.
Die Netzwerkfunktionen werden von der ENET-Bibliothek bereitgestellt. Daher ist die gesamte Kommunikation zwischen meinen Apps nicht TCP- oder UDP-kompatibel, sondern nur im benutzerdefinierten Protokoll, auch wenn es letztendlich schwierig ist, auf dem UDP zu basieren.
Ich denke nicht, dass es möglich ist, mit ENET zu tun, was ich will, deshalb bitte ich hier um Hilfe!
Nehmen wir an, ich habe das gleiche Spiel auf meinem Android-Handy, meinem Laptop und meinem PC. Sie befinden sich alle im selben WLAN-Netzwerk und daher in einem LAN, unabhängig davon, ob es sich um einen WLAN-Hotspot (?) Oder einen Haushaltsrouter handelt.
Ich brauche jeden dieser 3 Peers, um die anderen beiden im Netzwerk zu entdecken. Dies ist nur dazu gedacht, die IP von lebendigen Apps im LAN-Netzwerk zu finden, um Multiplayer-Spiele zwischen ihnen hosten zu können.
Ich kann mir nur einen effektiven Weg vorstellen, UDP-Broadcast, Antworten abwarten, aber wenn das die Lösung ist, brauche ich etwas Kleines, da dies der einzige Zweck der Implementierung ist.
Eine andere Möglichkeit könnte sein, zu versuchen, eine Verbindung zu allen IPs im LAN-Adress-Unterbereich herzustellen, aber ich glaube nicht, dass das Betriebssystem in diesem Fall bei mir sein würde: p
quelle
Antworten:
Wie viele Leute gesagt haben, wäre die Lösung die Verwendung von UDP-Broadcast , aber es gibt viele Implementierungsdetails. Ich bin kürzlich auf dasselbe Problem gestoßen, und nachdem ich eine Lösung ausgearbeitet habe, habe ich einen Blog-Beitrag und ein Beispielprojekt in Form eines LAN-Chat-Servers / Clients erstellt. Ich werde diese hier zusammenfassen, aber Sie sollten sie für weitere Details und echten Code überprüfen.
So funktioniert es, basierend auf einer Beschreibung von Lee Salzman, dem Erfinder von ENet:
Die gute Nachricht ist, dass ENet Wrapper-Funktionen für die Verwendung von Sockets bietet , sodass Sie alles in ENet ausführen können. Die schlechte Nachricht ist, dass die Hülle extrem dünn ist; Sie müssen über die Socket-Programmierung Bescheid wissen , z
select()
. Aus diesem Grund empfehle ich Ihnen, sich den Blog-Beitrag und das Beispielprojekt anzusehen, damit Sie den Code kopieren / einfügen und sich viel Zeit sparen können.Hier sind einige Hinweise und Fallstricke, falls Sie sich für eine eigene Implementierung entscheiden sollten:
enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)
(oderSOCK_DGRAM
für die einfache alte Socket-Programmierung) erstellen.enet_socket_set_option(socket, ENET_SOCKOPT_REUSEADDR, 1)
(oderSO_REUSEADDR
) wiederverwendet wird, damit mehrere Server auf derselben IP ausgeführt werden könnenenet_socket_set_option(scanner, ENET_SOCKOPT_BROADCAST, 1)
(oderSO_BROADCAST
) aktivieren , andernfalls können Sie nicht an die Broadcast-Adresse senden. Dies ist nur eine Sicherheitsfunktion , um das versehentliche Überfluten des Netzwerks zu erschweren.Leider ist dies nicht gerade eine "leichte" Lösung; Das Beispielprojekt erreicht insgesamt einige hundert LOC. Es wäre schön, wenn dies in eine Dienstprogrammbibliothek für ENet gepackt wäre, aber ich habe festgestellt, dass Sie für Spieleserver häufig weitere spielspezifische Informationen mit der Serverantwort senden möchten, um dies nützlich zu machen, z.
quelle
Wenn Sie Ihre Bibliothek nicht verlassen möchten, können Sie einfach Brute-Force verwenden und versuchen, eine Verbindung zu jeder der möglichen Adressen herzustellen. Die meisten Heim-LANs sind Class-C-Netzwerke (/ 24), in denen die ersten 24 Bit der IP-Adresse identisch sind und die letzten 8 Bit unterschiedlich sind. Sie haben also nur 255 mögliche IP-Adressen.
Dennoch wäre eine UDP-Übertragung die sauberere Alternative. Senden Sie einfach ein UDP-Paket an 255.255.255.255, und alle Clients hinter demselben Router erhalten es. Sie können dann eine Antwort an die Quell-IP und den Quellport des Pakets senden, um den Absender darüber zu informieren, dass sie vorhanden sind.
quelle
Sie können sich DNS-SD / ZeroConf / Avahi / Bonjour / mDNS ansehen . Es ist das Material, mit dem Apple Drucker, iTunes-Ordner usw. freigibt, aber es wurde an anderer Stelle übernommen. Avahi ist die OpenSource-Version, die Linux verwendet (nicht sicher, ob es nur Linux ist), nicht sicher, wie portabel das Ganze ist (obwohl es Implementierungen für die meisten Plattformen gibt).
Trotzdem ist es wahrscheinlich einfacher, nur die UDP-Übertragung durchzuführen.
quelle