Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

1

07.09.2012, 01:03

SFML 2 - UdpSocket

Guten Abend liebe Community,
Ich habe mir einen Pong-Klon geschreiben, den man über das Internet spielen kann, dazu benutze ich einen externen Server.
Zuerst habe ich es mit sf::TcpSocket gemacht, weil ich dazu viel gefunden habe (Tutorial, Beispiele) und man damit auch mehrere Clients bearbeiten kann.
Das Problem dabei war, dass es übelst gelaggt hat :/
Ich hab mich schlau gemacht und schnell gefunden, dass man Udp verwenden sollte.
Es gibt aber für Udp keinen listener, deswegen kann man eigentlich nur einen Client haben, deswegen benutze ich für das Verbinden sf::TcpSocket und für das Senden der Pakete sf::UdpSocket. Jetzt kommt aber mein Problem, dass ich nicht weiß wie ich die Parameter setzen muss, dass beim Server was ankommt! HIER habe ich oft nachgeschaut. Ich lasse die Clients (sf::UdpSocket) an den Port vom Server binden (den man beim Starten des Programms in der Konsole eingibt), wenn man mit dem Server verbunden ist.

Danach sende ich ein Paket:

C-/C++-Quelltext

1
udpSocket.send(packet, tcpSocket->getRemoteAddress(), serverPort);

udpSocket = sf::UdpSocket, der schon gebunden ist; tcpSocket = sf::TcpSocket*, dorthin connecte ich, also die RemoteAdress ist die lokale Adresse vom Server und serverPort = unsigned short, den man zu Beginn eingibt und an dem der Client auch bindet:
Es wird gesendet (sf::Socket::Done = true) und ich denke auch, dass das so stimmt?

Nun zum Server: Er bindet auch an einen Port und zwar an dem vom Client:

C-/C++-Quelltext

1
udpSocket.bind(tcpSocket->getRemotePort());

tcpSocket = sf::TcpSocket*, wenn ein Client verbunden ist.
Und so empfängt der Server: (genauso wie es in der Doku steht)

C-/C++-Quelltext

1
2
3
sf::IpAddress ipAdress;
unsigned short clientPort;
serverSocket.receive(packet, ipAdress, clientPort);

Aber, der Server freezed an dieser Stelle. Ich hab wirklich alles probiert, was nicht funktioniert. Google hat mir auch nichts geholfen.
Ich bin mir ziemlich sicher, dass ich irgendeinen Parameter falsch verwende und dass es beim Empfangen liegt.

Oder mach ich alles komplett falsch?
MfG Geheim!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Geheim« (07.09.2012, 01:10)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

07.09.2012, 01:32

Das Problem dabei war, dass es übelst gelaggt hat

Ich glaube nicht, dass das Protokol dein Problem ist. Du musst die Position der Schläger extra- und interpolieren.

Aber um auf dein UDP Problem einzugehen: Schau dir mal sf::SocketSelector an.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

3

07.09.2012, 02:02

Danke für die schnelle Antwort ;)
Aber um auf dein UDP Problem einzugehen: Schau dir mal sf::SocketSelector an.
Jetzt kommt aber mein Problem, dass ich nicht weiß wie ich die Parameter setzen muss, dass beim Server was ankommt!
Der Selector hilft da ja nicht weiter^^ Mit ihm kann ich zwischen den Clients unterscheiden, aber woher weiß der Server ohne Listener, dass ein neuer Client bereit zum Verbinden ist? Das Problem ist, dass der Server freezed :/
Ich glaube nicht, dass das Protokol dein Problem ist. Du musst die Position der Schläger extra- und interpolieren.
Sieht auf dem ersten Blick (Wikipedia) relativ komplex aus, aber auch irgendwie logisch! Warum reicht es nicht, nach einer Bewegung die Positionen der Schläger an die Clients zu schicken? Und wie müsste ich das dann bei dem Ball machen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

07.09.2012, 14:13

Dass dein Server blockiert sollte daran liegen, dass du synchrone Sockets benutzt. Wenn du dort eine einkommende Nachricht abfragen willst, dann blockiert die Methode das Programm, bis eine Nachricht vorhanden ist. Eine Möglichkeit wären asynchrone Sockets, oder ein Eigenbau mit Threads.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

07.09.2012, 18:13

aber woher weiß der Server ohne Listener, dass ein neuer Client bereit zum Verbinden ist?

UDP baut auch keine Verbindung auf. ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige