2013-02-04 76 views
0

我正在做一个游戏,我有2个客户端和一个服务器。 当我在游戏中移动时,我将数据发送到服务器(1-left,2-up,3-right,4-down)。 服务器将转发到其他客户端。C++ SFML tcp发送和接收

这里是服务器:

#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; 
} 

它不工作良好。服务器运行在我的电脑上,客户端运行在我的笔记本电脑上。 如果我启动两个客户端,并且随同一个客户端移动,我会在每个客户端(?)中以错误的顺序收到错误的数据包。

如果我删除此行:

recAndGive(Client2,Client1); 

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

+1

u的太快应该添加消息帧发送数据修复它,因为TCP协议是面向流的不是面向分组。 – user1748906

+0

我能做什么? – cylon

+1

看看http://www.codeproject.com/Articles/37496/TCP-IP-Protocol-Design-Message-Framing – user1748906

回答

0

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

如果您使用本指南,您应该不会有什么问题。

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

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