2013-02-04 103 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();