TCP / UDP mit SDL_net
-
Hi,
ich bastel an folgendem Problem bzgl. Server-Client:
- Der Server nimmt einen Client über TCP an und schickt dann via UDP Daten an ihn.
- Der Client baut zu einem Server über TCP eine Verbindung auf und erhält via UDP Daten von ihm.
Ich habe beide Skripte mal auf PasteBin hochgeladen:
server.cpp: http://pastebin.com/nvkKRP6n
client.cpp: http://pastebin.com/R4zLyD9SBlöderweise meldet der Server, dass das Senden via UDP nicht geklappt hat. Ich arbeite an der Sache jetzt schon eine ganze Weile und komme nicht vorran. Sieht jemand, was ich falsch mache?
LG Glocke
-
Du kannst ja keine UDP Daten über das TCP Protokoll schicken. Bau die "Verbindung" gleich mit UDP auf (es existiert keine wirkliche Verbindung wie bei TCP, da UDP verbindungslos ist) oder sende die Daten per TCP über dein Socket.
-
Glocke schrieb:
Hi,
ich bastel an folgendem Problem bzgl. Server-Client:
- Der Server nimmt einen Client über TCP an und schickt dann via UDP Daten an ihn.
- Der Client baut zu einem Server über TCP eine Verbindung auf und erhält via UDP Daten von ihm.
Ich habe beide Skripte mal auf PasteBin hochgeladen:
server.cpp: http://pastebin.com/nvkKRP6n
client.cpp: http://pastebin.com/R4zLyD9SBlöderweise meldet der Server, dass das Senden via UDP nicht geklappt hat. Ich arbeite an der Sache jetzt schon eine ganze Weile und komme nicht vorran. Sieht jemand, was ich falsch mache?
LG Glocke
Woher willst du bei UDP wissen, ob dein Paket angekommen ist?
Zu deinem Problem: Da der Client hinter einer Firewall steckt, blockiert diese die ankommenden Pakete! Lösungsansatz wäre, dass du per UDP vom Client an Server Heartbeats sendest. Folge: Deine Firewall erwartet eine Antwort und lässt Pakete durch, und zwar nur von der IP an die gesendet wurde und auch nur auf dem Port über den gesendet wurde, kommt was an. Ist dann eine Art Pseudo-Portöffnung
Achtung, schlechtes Beispiel:
-Client sendet durchgehend Heartbeats; >Clientseitig über Port 62045 and die IP 123.45.6.78 -Server erhält das Heartbeat Paket und speichert die IP und den Port vom Rechner, von dem er das Paket erhalten hat >Server sucht, welche TCP Verbindung dieselbe IP hat >Server schreit "AH!!! DAS IST SPIELER 3!" >Server sendet nun die Daten an ClientIp:Port -Client erwartet auf dem Port bzw. über dasselbe Socket die Spieldaten
PS: Beim Server sollten die Ports natürlich offen sein, also in der Firewall/Fritzbox/Router "Port-Forwarding"
Da man sowas nicht vom Client erwartet, muss das ausgetrickst werden
PPS: Angenommen, dein Client läuft auf Windows, dann musst du zu Beginn des Programms ein UDP-Packet an eine ungültige ip mit ungültigem port senden, damit sich die windows-firewall meldet und der benutzer das programm freigeben kann. (ist bei mir zumindest mal so)
-
udp-ne-tcp schrieb:
Du kannst ja keine UDP Daten über das TCP Protokoll schicken. Bau die "Verbindung" gleich mit UDP auf (es existiert keine wirkliche Verbindung wie bei TCP, da UDP verbindungslos ist) oder sende die Daten per TCP über dein Socket.
Ich sende sie doch gar nicht über das TCP Protokoll O_o Ich verwende UDPpacket und SDLNet_UDP_Send bzw. SDLNet_UDP_Recv ...
kralo9 schrieb:
Woher willst du bei UDP wissen, ob dein Paket angekommen ist?
Das brauch ich gar nicht zu wissen.
kralo9 schrieb:
Zu deinem Problem: Da der Client hinter einer Firewall steckt, blockiert diese die ankommenden Pakete!
Nein, er steckt hinter keiner Firewall
kralo9 schrieb:
Lösungsansatz wäre, dass du per UDP vom Client an Server Heartbeats sendest. Folge: Deine Firewall erwartet eine Antwort und lässt Pakete durch, und zwar nur von der IP an die gesendet wurde und auch nur auf dem Port über den gesendet wurde, kommt was an. Ist dann eine Art Pseudo-Portöffnung
Wo nimmst du das mit der Firewall her?!
kralo9 schrieb:
PPS: Angenommen, dein Client läuft auf Windows, dann musst du zu Beginn des Programms ein UDP-Packet an eine ungültige ip mit ungültigem port senden, damit sich die windows-firewall meldet und der benutzer das programm freigeben kann. (ist bei mir zumindest mal so)
Und auf Linux? Ich weiß echt nicht woher du das mit der Firewall nimmst
Ich will vom Server an den Clients Updates schicken, nicht andersrum. Dabei meldet sich der Client zunächst via TCP beim Server an (weil weitere Funktionalität via TCP realisiert wird - das gezeigte Programm ist nur eine Vereinfachung meines Problems). Dass die Pakete gesendet werden hab ich mit Wireshark überprüftm indem ich am Loopback Interface (ich teste atm via localhost) gesniffert habe. Nur kommt beim Client gar nichts an (und damit meine ich keines der zig Pakete die ich versucht habe). Zwischen Localhost und Localhost des gleichen Rechners sollte die Paket-Verschwinde-Rate eigentlich gegen 0 gehen O_o
LG Glocke