0

我正在制作一个游戏,我有 2 个客户端和一个服务器。当我在游戏中移动时,我将数据发送到服务器(1-left,2-up,3-right,4-down)。服务器向前发送到另一个客户端。

这是服务器:

#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 上运行,客户端在我的笔记本电脑上运行。如果我启动两个客户端并移动一个客户端,我会在每个客户端中以错误的顺序收到错误的数据包(?)。

如果我删除这一行:

recAndGive(Client2,Client1);

然后我启动了两个客户端,并与第一个客户端一起移动,然后我在第二个客户端上收到了完美的数据。问题是什么?请帮我 :)

4

1 回答 1

0

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

如果您使用本指南,您应该没有任何问题。

我遇到的唯一问题是,当我添加 likepacket << coorX << coorY并打开该数据包packet >> p2CoorX >> p2CoorY时,我遇到了一个大问题,问题是,数据包根本没有清理。所以它将 coorX 和 coorY 放入数据包中,并且它一次又一次地这样做......数据包变得非常大,而当它变得越来越大时,接收部分(packet >> p2CoorX >> p2CoorY)只读取前两个变量。

那是我的问题,但我使用packet.clear();

于 2014-05-10T12:35:13.323 回答