C# P2P Verbindung herstellen

@Nilson also das Grundprinzip von TCP ist es doch, soweit ich das gelernt hab, eher, dass Pakete bestätigt werden indem auf eine Antwort gewartet wird^^
Aber nein darum gehts gar nicht. Unitys UNet Server schmeißt nach eigener Aussage wohl die Leute raus wenn entweder die Bandbreite Überschritten worde, das ist bei mir sicher nicht der Fall, oder eben nach etwa 2 Minuten. Das macht zumindest Sinn, weil es nach dieser Zeit immer passiert XD

@Raijin Ja, normalerweise ist es Bidirektional. Aber das kann ich mir ja jetzt abschminken, da ich dann von meinen nutzern verlangen. Sobald man also VOM Server ZUM Client eine Verbindung aufbaut wird diese verweigert. Anders gesagt: Von Innen nach Außen geht aber nicht andersrum.

Das bedeutet dass ich mit WebRequests Arbeiten muss, also eine Verbindung zu einem stets Online präsenten Server aufbauen muss, dazu muss ich mir eine Subdomain mieten oder aber irgendetwas a la Unet finden, dass mich nicht nach 2 Minuten rausschmeißt.

Und bei der Verbindung zu einem Online-Server kann der Server natürlich an dich keine Requests senden. Oder hast du schonmal ohne von Google ne Nachricht gekriegt ohne sie angefordert zu haben? Zumindest glaube ich, dass es so ist, ich reim mir hier doch nur alles zusammen^^

Und folglich kann man nur so arbeiten wie ich es geschildert hatte
 
Kokujou schrieb:
Client1 sendet Nachricht A an Server
Server setzt Nachricht für Client 2 auf Nachricht A
Client 2 ruft neue Nachricht ab bis Rückgabe nicht leer
Client 2 bekommt Nachricht A vom Server
Client 2 bestätigt Empfang der Nachricht
Server löscht Nachricht A für Player 2 sodass nächste Rückgabe leer ist
So könnte man das mit HTTP umsetzen. Das ist aber kein passendes Protokoll hierfür.

Client1, 2 und 3 haben alle eine aktive (TCP) Verbindung zum Server
Client1 sagt dem Server "ich bewege mich 2m nach norden"
Server sendet zu Client 2 und 3 - ohne, dass diese nachfragen müssen - "Client1 hat sich 2m nach norden bewegt"
Fertig. Nix zwischenspeichern, nix in Dauerschleife abfragen, nix bestätigen (TCP stellt das ankommen ja sicher..).


Kokujou schrieb:
hast du schonmal ohne von Google ne Nachricht gekriegt ohne sie angefordert zu haben?
Noch nie Push-Benachrichtigungen bekommen? Stichword GCM.
E-Mails bekommst du i.d.R. auch sofort, und nicht nur z.B. alle 15 Minuten (wie das Aktualisierungs-Interval eingestellt sein könnte), da hier immer ein Kanal offen bleibt und der Server ne Benachrichtigung senden kann.
 
Zuletzt bearbeitet:
Dann müsst ihr mir aber mal helfen...
Wenn eine normale TCP Verbindung zwischen zwei Computern nicht möglich ist ohne dass sie mit der Firewall in Konflikt kommt, warum kann dann ein Server Daten auf dieselbe Weise senden und wie geht das überhaupt?

Ich meine wenn das geht ist das Super und erklärt einiges aber ich nahm an dass JEDE eingehende Verbindung aus... okay ich habs grad selbstgemerkt.

Das Problem hat ja was mit Ports zutun und ein HTTP Server würde ja theoretisch Port 80 verwenden und der ist freigegeben und legitim. Stimmt das soweit?
 
@Kokujou : Irgendwie verwechselt du da etwas. Der Verbindungsaufbau geht natürlich vom Client zum Server, aber sobald die Verbindung steht sind beide Seiten grundsätzlich gleichberechtigt und können beliebig Daten austauschen. Das ist wie gesagt eine Frage des Anwendungsprotokolls. TCP ist letztendlich nur der Postbote, der die Pakete durch die Gegend fährt und darauf aufpasst, dass alle ankommen.

Das Problem ist, dass man dir ohne konkrete Details und adäquatem Hintergrundwissen deinerseits kaum helfen kann. Bist du dir sicher, dass du mit deinen Projekt nicht einen oder zwei Schritte zuviel nimmst? Vielleicht solltest du erstmal im LAN mit einem banalen Chatprogramm starten, um ein Gefühl für Netzwerkprogrammierung zu bekommen. Dein aktuelles Projekt scheint mir etwas ... ambitioniert, wenn dir das Grundverständnis für Netzwerkverbindungen fehlt.
 
Nein, stimmt nicht. Bei Clients ist i.d.R. kein einziger Port "frei".

Client verbindet sich zu Server, Port ganz egal (bzw halt das worauf der Server lauscht). Der Client initiiert also die Verbindung, das wird von den Firewalls erlaubt und von NAT automatisch umgesetzt. Der Client hat hier bspw. den Port 53322 genutzt, das merkt sich die Firewall. Wenn jetzt der Server von seinem Port 80 (also das, womit der Client sich verbunden hat), ein Paket an den (TCP-)Port 53322 des Clients schickt, weiß die Firewall, das ist eine Antwort auf die Verbindung vom Client und stellt das durch.
 
Port 80 es genau legitim wie Port 17428. Es gibt keine per Definition freigegeben Ports. Jeder Billigrouter blockt JEDEN eingehenden Port bis auf

A) Ports für die eine Ausnahme in der Firewall bzw. eine Portweiterleitung vorhanden ist
B) Ports, die für eine ausgehende Verbindung als Antwortport gekennzeichnet wurde
 
Okay ich glaub ich habs verstanden... Stimmt bei TCP kommt ja gar nicht erst eine Verbindung zu Stande.

@Raijin Du hast natürlich recht wenn es jetzt so lowlevel geht bin ich ziemlich aufgeschmissen. Aber normalerweise sollte Unity, meine Engine, ja ein Wrapper zur Verfügungstellen dass das ganze Schnell und einfach regelt. Jetzt hab ich das Spiel in dem Aspekt schon sogut wie fertig und merke jetzt das das ganze UNet System völliger Humbuck ist und muss mein ganzes Projekt ummodeln. Vor allem ist es für meine Masterarbeit, da kann ich schlecht sagen "sorry ich lasses weg"^^

Aber die Lösungen die ich jetzt ausprobiere bleiben. In der Reihnfolge:
  1. werde ich Photon ausprobieren, das hat man mir empfohlen als Alternative zu Unet, quasi ein Wrapper für einen Online-Server.
  2. das UPNP-zeug
und wenn das alles nicht funktioniert:
3. Selbst einen Server bauen, der die Verbindung zu beiden Client verwaltet. Das wird nochmal ein Riesen Spaß, weil ich mit Serverprogrammierung null erfahrung hab. Ich würd gern ASP.Net nehmen
 
Kokujou schrieb:
:freak:
Das ist ein Framework für Websites.
Was du brauchst ist eine einfache Konsolenapplikation, die ein TcpListener instanziiert, auf Port XY lauscht und ein paar Pakete austauscht, mehr nicht.
 
UPnP solltest du nicht brauchen. Zum einen haben das viele deaktiviert, weil es ein Sicherheitsrisiko darstellt.
Zum anderen: Für Ausgehende Verbindungen (Client zum Server) öffnet der Router automatisch den passenden Port für die Rückantwort. Und wenn der Server bei dir Zuhause läuft kannst du ja selbst die Weiterleitung im Router eintragen.
Kokujou schrieb:
@Nilson also das Grundprinzip von TCP ist es doch, soweit ich das gelernt hab, eher, dass Pakete bestätigt werden indem auf eine Antwort gewartet wird^^
Das Grundprinzip von TCP ist die Verbindung bzw. der Verbindungsaufbau. Und weil man die Verbindung hat kann man z.B. die Pakete nummerieren und durch Acks den Empfang bestätigen.
 
Zuletzt bearbeitet:
Eigentlich ist das alles kein Hexenwerk, wirklich nicht. Du nimmst aber scheinbar zu viele Stufen auf einmal und das führt offensichtlich dazu, dass du den Überblick verlierst.

Läuft deine Anwendung denn innerhalb des lokalen Netzwerks? Wenn nicht, dann ist es wenig sinnvoll, dies weiter über das Internet zu versuchen. Erst wenn die Netzwerkverbindung im LAN sauber läuft, kümmerst du dich um die erweiterten Anforderungen über Fremdnetzwerke hinweg und durch Firewalls hindurch.
 
Also ich formuliers mal so: Würden die Nachrichten so ankommen wie sie sollten dann wäre mein Ganzes Programm im Hinblick auf den Mehrspielermodus fertig. Keine Probleme, keine Fragen. Fertig. Das heißt ich brauche jetzt nur irgendeine Möglichkeit ohne zutun des Benutzers Byte Arrays von A nach B zu senden.

UPnP war ja damit ich doch über P2P arbeiten kann.

Okay das bedeutet... Gibt es... irgendeine kostenlose Online-Präsenz auf der man sone Konsolenanwendung laufen haben kann? Gibt es irgendeine möglichkeit für sowas nen Server zu haben? XD Oder das dann vielleicht doch mit nem Framework wie ASP zu regeln? Oder von mir aus PHP! Ich meine Dass PHP auf Requests antwortet ist ja immerhin schonmal möglich, zumindest meine Aktion mit dem Zwischenspeichern wäre mit PHP denkbar.
 
Guck mal in den Link aus meinem Beitrag#20
http://www.codeplanet.eu/tutorials/csharp/4-tcp-ip-socket-programmierung-in-csharp.html
Da wird ein einfacher echo TCP-Server aufgebaut. Das Beispiel lässt sich sicherlich abwandeln, sodass er das Paket an einen zweiten Client schickt.
Und wie gesagt, bring das erstmal bei dir zuhause im LAN zum laufen. Dann kann man sich Gedanken darüber machen wie man das über das Internet regelt.
 
Kokujou schrieb:
Framework wie ASP zu regeln? Oder von mir aus PHP!
Das eine ist ein Framework, das andere ne Sprache für Webseiten/HTTP APIs. Das willst du nicht. Du willst hier kein HTTP nutzen.
Mach einfach ein Konsolenprojekt und nutz den TcpListener. Server gibts genug, das ist nicht das Problem.

Alternativ könntest du das auch mit Node.js machen.
 
Dass es genug Server gibt weiß ich es sollte aber kostenlos sein und davon gehört dass man auf externen Servern irgendwelche Exe dateien laufen lassen kann hab ich noch nie gehört.

Das wäre aber natürlich am coolsten wenn ich das so abwandeln könnte. Ich weiß nur, dass wann immer ich eine TCP-Verbindung zu einem Client aufbaue die Verbindung verweigert wird. Also das können wir sicher streichen. Stichwort P2P

Und ja natürlich will ich kein HTTP. Aber wenn ich so einen Wunderserver nicht finde ist das die letzte Option wenn Photon, UPnP und das kostenlose Serverprinzip nicht funktioniert
 
Das heißt also, dass du im LAN schon 2+ Clients mit dem Server verbunden hast und es funktioniert?

Dann

  • prüfst du bei deinem Server ob die Firewall eingehend TCP 9000 von "beliebigen Quell-IPs" erlaubt bzw stellst es ggfs ein
  • startest du den Server in deinem Netzwerk
  • richtest eine Portweiterleitung im Router ein, die Port TCP 9000 an deinen Server schickt
  • startest den Client auf einem Endgerät in einem anderen Netzwerk (zB Nachbars WLAN)
  • verbindest den Client mit der öffentlichen IP deines Anschlusses auf TCP 9000


Das setzt allerdings voraus, dass dein Anschluss auch von außen erreichbar ist (Stichwort CGN) und dass im Client-Netzwerk der ausgehende Port9000 freigegeben ist (in einem 08/15 Netzwerk immer der Fall, via Mobilfunk nicht zwingend).
Ergänzung ()

Man kann sich Server im www mieten, auf denen man arbeiten kann als wäre der Server bei dir daheim. Meistens laufen diese Server mit einem Linux-Derivat, aber man kann sie auch mit Windows Server ausstatten, Lizenz vorausgesetzt. Dann kannst du auch deine .exe da laufen lassen oder du kompilierst die Serveranwendung für Linux. Letzteres erfordert aber unter Umständen gewisse Anpassungen.
 
Ein Server bekommst du z.B. bei netcup (da hoste ich selbst mehrere Server): https://www.netcup.de/vserver/vps.php. Der kleinste würde da schon für dich reichen.

Da gibts haufenweise 5€ Neukunden-Gutscheine, das heißt du hättest den auch kostenlos für den ersten Monat: 36nc15497970720
 
Wann hab ich das denn gesagt? XD jetzt hab ich komplett den Kontext verloren.

Also ich versuchs nochmal zusammenzufassen:
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 und mein Spiel damit vollständig nutzlos geworden ist, kann ich das nichtmehr verwenden. Das ist der Part der noch am besten Funktioniert hat.

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.

Bleibt also noch entweder einen anderen Serverwrapper wie UNet zu finden, oder selbst einen Server zu bauen.

Was das angeht gibt es 2 Möglichkeiten: Entweder ich schaffe es tatsächlich irgendne Konsolenanwendung auf nem kostnelosen Server zum laufen zu bringen - wäre mir neu.
Oder ich arbeite tatsächlich via HTTP, was sehr viel umständlicher vom Algorithmus wäre, wegen dem ganzen Zwischenspeichern und weil da dann wohl nur Requestbasiertes funktioniert.

Und ja NetCup bietet sowas offensichtlich, aber nein ich zahle nicht ^^ das ist mir auch viel zu risikoreich wenn es doch nicht das ist was ich will, ich bin hier ja am Entwickeln. Und das ist auch viel zu aufwändig. Es geht hier um Übertragungen im Byte Bereich. 100Byte pro Spiel wären ja schon fast das Maximum.
 
Kokujou schrieb:
Konsolenanwendung auf nem kostnelosen Server zum laufen zu bringen
Das ist ansich ganz einfach, solltest du aber halbwegs gut absichern (Firewall und so :D).

Kokujou schrieb:
Vergiss das. HTTP ist hier fehl am Platz.

Kokujou schrieb:
aber nein ich zahle nicht
Der erste Monat wäre frei, und dann kannst du monatlich kündigen. 1 Monat sollte doch für dich reichen?!
Ansonsten wirst du wohl kein "richtigen" Server (also mehr als nur Webhosting) für 0,-€ bekommen.


Wenn du es mit .NET Core oder Node.js umsetzt (wahrscheinlich geht auch .Net Framework über Mono), könnte ich dir das vorübergehend auf meinem Server hosten, jedoch ohne jegliche Gewähr.
 
Ja es stimmt, reichen würde es allemal, und es wäre auf jeden Fall ne Super lösung aber ich mag solche Lösungen nicht die nur begrenzt funktionieren. Ich meine später kann ich doch auch nicht sagen "hey, das ding funktioniert nur für die Hälfte der Benutzer aber das kommt schon so hin." oder "hey, das ding läuft nach nem Monat ab, danach müssen wir sehen wo wir bleiben."

Und genau deswegen ist HTTP hier zwar total Mist und Fehl am Platz, aber wenn Photon nicht funktioniert ist das wohl alles was mir übrig bleibt. Und fehl am Platz oder nicht, so wie ich das geschildert habe müsste es mindestens möglich sein und eine Subdomain verschwindet nicht nach einem Monat ;)

Aber hey, vielleicht funktioniert es ja mit Photon und ich bin auf jeden Fall dankbar, dass ich jetzt viel Schlauer bin als vorher :)
 
Bei den Webhostings kannst du auch nicht sicher sein, dass es dauerhaft läuft. Bei vielen wird der Account gesperrt, wenn du da keine Website hostest, auf der Werbung ausgeliefert werden kann.

Ansonsten fällt mir noch Uberspace ein, da bekommst du für 1€ Terminalzugriff und kannst beliebige binaries ausführen.
 
Zurück
Oben