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!