0

私はゲームを作っています。2つのクライアントと1つのサーバーがあります。ゲーム内を移動すると、サーバーにデータが送信されます(1-左、2-上、3-右、4-下)。サーバーは他のクライアントに転送を送信します。

これがサーバーです:

#include <iostream>
#include <SFML/Network.hpp>
#include <SFML/System.hpp>
using namespace std;

void recAndGive(sf::SocketTCP fromSock, sf::SocketTCP toSock)
{
   sf::Packet Packet;
   if(fromSock.Receive(Packet) == sf::Socket::Done)
   {
       toSock.Send(Packet);
   }

}

int main()
{
   cout << "Server is running. [192.168.1.100] [4567]" << endl << endl;
   sf::IPAddress Client1_ip;
   sf::IPAddress Client2_ip;

   sf::SocketTCP Client1;
   sf::SocketTCP Client2;

   sf::SocketTCP Listener;

   if(!Listener.Listen(4567))
       return 1;

   cout << "Server is listenig to port 4567, waiting for connections..." << endl;

   //waiting for client1
   Listener.Accept(Client1,&Client1_ip);
   cout << "Client connected : " << Client1_ip << endl;

   //waiting for client2
   Listener.Accept(Client2,&Client2_ip);
   cout << "Client connected : " << Client2_ip << endl;

   while(true)
   {
       recAndGive(Client1,Client2);
       recAndGive(Client2,Client1);
   }


   return 0;
}

うまくいきません。サーバーは私のPCで実行され、クライアントは私のラップトップで実行されます。2つのクライアントを起動し、1つで移動すると、各クライアントで間違った順序で間違ったパケットを受信します(?)。

この行を削除すると:

recAndGive(Client2,Client1);

次に、2つのクライアントを起動し、最初のクライアントで移動してから、2番目のクライアントで完全なデータを受け取ります。何が問題ですか?私を助けてください :)

4

1 に答える 1

0

http://sfml-dev.org/tutorials/2.1/network-socket.php

このガイドを使用すれば問題はありません。

私が抱えていた唯一の問題は、 のように追加packet << coorX << coorYし、そのパケットを のようpacket >> p2CoorX >> p2CoorYに開いたときに、大きな問題が発生したことでした。問題は、パケットがまったくクリーニングされなかったことです。したがって、coorX と coorY をパケットに配置し、何度も繰り返します... パケットは非常に大きくなり、大きくなる一方で、受信側 ( packet >> p2CoorX >> p2CoorY) は最初の 2 つの変数のみを読み取ります。

それが私の問題でしたが、使用して修正しましたpacket.clear();

于 2014-05-10T12:35:13.323 に答える