C# P2P Verbindung herstellen

Kokujou schrieb:
Dann hab ich mit TcpClients gearbeitet, die aber aktiv die Verbindung zurückgewiesen haben, also nix für den Standarduser, besonders wenn UPnP deaktiviert werden kann. Ich brauche ja etwas dass von JEDEM Spielbar ist mit JEDEM Betriebssystem.
Allmählich bekomme ich Kopfschmerzen.. Wenn das deine Masterarbeit werden soll, empfehle ich dir dringend, dich mit deinem Professor zu unterhalten. Er kennt dein Thema besser als wir und besser als du es hier erklären kannst und er kann dir auch gezielter helfen als wir es können.

Von Unity habe ich leider keinen blassen Schimmer, habe aber schon diverse Netzwerkanwendungen programmiert - ganz normal mit TCPListener und Co.

Wie auch immer, einen Versuch starte ich noch:

Du brauchst eine Serveranwendung, die via TCPListener auf Port TCP9000 auf eingehende Clientverbindungen wartet. Die Clientanwendung muss dagegen offensichtlich einen TCPClient verwenden. Weiterhin verbindet sich die Client-Anwendung mit der (öffentlichen) IP deines Servers und der Router am Server braucht dafür eine Portweiterleitung. Der Server muss in seiner lokalen Firewall den eingehenden Port TCP9000 für beliebige Quell-IPs freigeben.
Für einen Spieler (Client) ist die Verbindung zum Server ausgehend und bedarf in einem 08/15 Netzwerk keine weiteren Anpassungen. Nachrichten vom Server zum Client werden ganz simpel über send-Befehle in die bestehende TCP-Verbindung geschrieben und gehen über selbige Verbindung auch sauber durch die Router-Firewall des Clientnetzwerks.
 
Ja. Theoretisch wäre das schon aber meine Profs haben null Ahnung. Ich hab sie schon gefragt.

Und ja. Ich hatte das auch so verstanden. Das Problem ist, nun schon zum xten Mal, dass ich keinen Server auf den Rechnern der Spieler hosten kann und keine Anbindung zu irgendetwas habe, dass einen Server hosten könnte. Ich werde mir für die Masterarbeit keinen Server mieten. Mein Thema ist eh viel zu komplex für eine Masterarbeit. Zumindest an unserer Hochschule, wo sie froh sein können wenn wir 1+1 rechnen können. Aber das ist ne andere Geschichte.

Mein Versuch ist halt fehlgeschlagen weil ich genau das versucht habe. Ein TcpListener für jeden Spieler zu bauen. Dass ist dann, nach jetzigem Wissensstand, unmöglich.

Also kann ich das gesamte Tcp system komplett in die Tonne schmeißen :) Ich könnte aber zumindest fragen, ob die Hochschule für sowas vielleicht nen Server hat, den man benutzen könnte...
 
Kokujou schrieb:
Zuerst hatte ich Unitys UNet. Das ist ein Server der von Unity bereitgestelt wurde und die Kommunikation von Spieler händelt. Darauf baut mein gesamtes Spiel auf. Da aber jetzt kllar wurde dass die nach 2 Minuten die Verbindung trennen
Ich würde eventuell das Problem an der Wurzel packen und prüfen, warum die die dich rauswerfen. Aus Spaß an der Freude werden die das nicht machen. Ich kann mich mit Unity auch nicht aus, aber einen Grund für das Verhalten werden die wohl haben, oder?
 
Ich nehme an weil es nunmal ein kostenloser Dienst ist und sie die Bandbreite begrenzen wollen. Das ist zumindest alles was mir dazu einfällt. Es steht aber wohl irgendwo bei denen drinne was von 2min und 4KB/s.

Es ist mir zwar völlig unbegreiflich aber so ist es wohl.
 
Und warum hostest du den Server nicht bei dir @ home?

Ich schließe mich aber @Nilson an: Wenn es denn für die 2 Minuten mit Unity läuft wie gewünscht, dann solltest du vielleicht erst einmal dieses Problem angehen. Auch kann eine Reconnect-Funktion im Client bei unvorhergesehenen Verbindungsabbrüchen helfen. Allerdings nicht als workaround für potentielle Fehler bei der Implementierung bzw Nutzung von Unity...
 
Du kannst halt nicht erwarten dass du das alles umsonst bekommst. Entweder hostest du es bei dir zuhause selbst, oder musst halt ein klein wenig bezahlen. Wenn dir das nichtmal 1€ für ein Monat wert ist... dann ist das dein Problem.
 
Das hab ich ja versucht! Ich hab stundenlang im Internet verbracht und keine hat gesagt wie man den Fehler löst. Nur "ist halt so". Und wie die Verbindung wiederhergestellt wird weiß ich auch nicht, oder ob das überhaupt geht.
Ich kann zwar das disconnecten als Event abfangen, aber das ist auch alles was mir dazu einfällt.

Ich meine ich brauche wirklich vielleicht 100 Bytes pro Sesssion, maximal 1KB. Ich meine alles was ich hin und herschicke ist hier mal ein Int, hier mal ein Bool, ich hab mein Netzwerk extra auf Maximum komprimiert! Ich könnte es nur noch kleiner machen wenn ich statt der Kartennamen die IDs rumschicke aber das ist mir dann doch zu unsicher.
 
Kokujou schrieb:
Das hab ich ja versucht! Ich hab stundenlang im Internet verbracht und keine hat gesagt wie man den Fehler löst.
Ich hab doch schon mehrfach beschrieben welche Voraussetzungen erfüllt sein müssen, um einen Server im Netzwerk zu hosten...

Welchen Provider hast du bzw welche Technik kommt zum Einsatz? (V)DSL? Kabel? LTE? Hybrid?
 
Verzeihung ich hätte richtig zitieren sollen. Ich hab es stundenlang versucht das Problem bei Unity zu korrigieren! den Server bei mire inzurichten, das wollte ich eigentlich vermeiden. Zur Not gehts natürlich auch aber nunja.

Erstmal versuche ich wie gesagt Photon, was so etas ähnliches wie Unitys UNet sein soll, darauf bin ich kürzlich gestoßen. Ich bete, dass es funktioniert ansonsten werd cih wohl doch die Idee mit der Subdomain machen. Denn ganz ehrlich: Subdomains haben nen schlechten Ruf, die die ich bis jetzt hatte waren immer Online wenn ich sie gebraucht habe. Gut sie waren kostenlos und niemand hat da irgendwelche Rechte sich zu beschweren, aber das ist ja egal.

Sie waren immer Online und... Gut was die Löschung angeht keine Ahnung aber solange sie aktiv genutzt werden und sie dazu noch wenig speicher verbrauchen ist das Risiko dafür eher gering, glaube ich zumindest.
Ergänzung ()

Ist zumindest besser als wenn man zum ausprobieren des Programms erstmal mich anrufen muss, damit ich den Server starte XD
 
Das Verbindungsproblem kann auch ganz woanders lauern, z.B muss bei der Fritz!Box diese Option aktiviert sein wenn ein Handy/Tablet mit dem LAN kommunizieren will, es darf auch nicht im Gastnetz sein !
Fritzbox.png
 
Ja aber wie ich schon mehrfach sagte bringt es ja nix wenn ich den nutzer bitten muss, irgendwelche komplizierten einstellungen vorzunehmen bevor er mein spiel spielen darf.

für MICH könnte ich das problem lösen aber das würde nicht helfen wenn dann alle andern nicht könnten^^
 
Hast du dir mal das Holepunching angeschaut?
 
gibts das auch für TCP? oder muss ich das TCP Prinzip dann selbst implementieren ?
 
Kokujou schrieb:
Ja aber wie ich schon mehrfach sagte bringt es ja nix wenn ich den nutzer bitten muss, irgendwelche komplizierten einstellungen vorzunehmen bevor er mein spiel spielen darf.

für MICH könnte ich das problem lösen aber das würde nicht helfen wenn dann alle andern nicht könnten^^
Der Nutzer wird das Problem vermutlich nicht haben, da er ja nur von seinem PC oder Handy übers Internet mit jemand anderem spielt, in beiden Fällen wird die SSDP UPnp Library dafür sorgen das eine Kommunikation möglich ist. Nur in deinem Fall wo das Handy auf ein LAN-Gerät zugreifen muss ist diese Option (& Gastnetz) von Bedeutung.
 
Wenn's nur für die Masterarbeit ist, weiß ich nicht was so schlimm daran sein sollte, dass du den Server bei dir daheim erstmal starten müsstest. Wir reden hier doch im weitesten Sinne von einer wissenschaftlichen Abhandlung und nicht davon, ein Unternehmen wie EA zu gründen... Der Prof will nur sehen, dass dein Konzept funktioniert und halbwegs professionell umgesetzt wurde. Ohne es zu kennen, kann ich kann mir mit Verlaub kaum vorstellen, dass dein Spiel in die Fußstapfen von Rimworld und Co tritt und spielermäßig durch die Decke geht, wenn du nicht mal 2€ im Monat für einen Server investieren willst.

Ich hab damals auch "nur" eine RISC-CPU auf nem ASIC programmiert, nicht um das Ding an Intel zu verkaufen, sondern um zu zeigen, dass ich mein Studium der Technischen Informatik erfolgreich absolviert habe ;)
 
Ja ihr habt ja recht... naja auf jeden Fall kenne ich jetzt das Problem und die Lösungen^^ und ich hoffe erstmal dass Photon erfolgreich funktioniert dann kann ich mir alle weitere Überlegungen nämlich sparen. Also drückt mir die Daumen!
 
Zum Thema hole punching lege ich dir mal diesen Artikel ans Herz: Klick!
 
Es gibt wohl noch keine öffentlich anerkannte Bibliothek wo man einfach Ziel und Quelle angibt und die Beide durch anwendung von tausend verschiedenen Methoden schon irgendwie verbunden werden oder? XD
das wäre n schöner einzeiler und würde die Netzwerkwelt wahrscheinlich in Extase versetzen.
 
Btw., Du kannst doch, wenn es tatsächlich nur ein paar Bytes sind, alles mittels UDP schicken!? Denn UDP lässt eine Übertragung von bis zu 64000 Bytes? zu. Damit kannst Du auch wunderbar ein P2P-Netzwerk aufbauen.

Das, was Du lediglich brauchst ist einen zentralen Punkt, der die Endpunkten der jeweiligen Nutzer vermittelt. Das heißt, wenn jemand das Spiel startet, muss er seine IP-Adresse + Port an eine Liste schicken auf die alle anderen Clients auch zugreifen können. Und fertig.

Hier mal ein paar Bibliotheken, welche auch andere Spiele nutzen für P2P:
https://github.com/KillaMaaki/Netcode.IO.NET
https://github.com/zeromq/netmq

Den zentralen Punkt brauchst Du deswegen, weil der Anwender ja auch eine Verbindung zu anderen Clients aufbauen muss bzw. soll. Und wie soll das gehen, wenn nichts bekannt ist? Andernfalls wird es schwer..

Auf GitHub findest Du einige Bibliotheken die Dir P2P Möglichkeiten bereitstellen. Natürlich kannst auch ein TCP-Hole Punch aufbauen.. Das ist jedoch weitaus aufwändiger.
 
Und per UDP muss er nicht an der Firewall vorbei? Da müsste er genauso punchen.
 
Zurück
Oben