2012-04-15 7 views
0

Ich arbeite an einem Labyrinth-Spiel, wo zwei Spieler verbinden (einer fungiert als Host, der andere als der Spieler). In diesem sende ich XML-Daten als Zeichenfolge mit der Funktion send(). (Ich verwende auch eine vorgefertigte Socket-Klasse, wobei ich bedenke, dass dies für gemeinnützige Aktivitäten gilt, was bedeutet, dass das Urheberrecht nicht verletzt wird.) Bedenken Sie, dass der Client & Server unter Windows 7 mit WinSock2 läuft. h Paket.C++ Socket recv() liest die gleiche Zeichenfolge zweimal (WinSock2)

Das Problem, das ich begegne, ist ziemlich einfach. Ich sende zuerst die Maze XML-Datei, diese liest richtig und kann das Labyrinth in einer Reihe von Kacheln speichern. Danach wird eine andere XML-Datei gesendet, die die Position des Spielers (und des Gegners) des Spiels des anderen Benutzers aktualisiert. Wenn ich jedoch versuche, diese Zeile zu lesen, fängt es an, vom Anfang des Puffers zu lesen, und es scheint, als ob der Puffer nicht gelöscht wird, weil er die Maze-XML-Datei erneut liest.

Gibt es eine Möglichkeit, den von recv() verwendeten Puffer zu löschen? Ich kann mir keinen anderen Grund vorstellen, warum das Maze-XML zweimal gelesen wird, wenn es nicht zweimal gesendet wird.

Unten ist der Code, der das XML Zeichen für Zeichen empfängt. Dies ist der Code des Servers, der Client-Code kehrt nur die Reihenfolge des Sendens/Empfangens der Daten um. Nicht sicher, ob das notwendig oder relevant ist.

[code]

while (1) { char r; 

switch(recv(s_, &r, 1, 0)) { 
    case 0: // not connected anymore; 
      // ... but last line sent 
      // might not end in \n, 
      // so return ret anyway. 
    return ret; 
    case -1: 
    return ""; 
//  if (errno == EAGAIN) { 
//  return ret; 
//  } else { 
//  // not connected anymore 
//  return ""; 
//  } 
} 


ret += r; 
if (r == '<') { 
    counter = 0; 
    check = ""; 
} 
check += r; 
if (counter == 6 && check.compare(ender) == 0) 
{ 

    return ret; 
} 
//if (r == '\n') return ret; 
counter++; 
} 

[/ code]

Und das ist der Code, der/sendet die verschiedenen XML-Dateien empfängt.

[code]

Socket* s=in.Accept(); 


cout << "Accepted a Call from a Client." << endl; 


// Here is where we receive the first (Maze) XML File, and 
// send our maze as XML 


string mazeS = s->ReceiveLineMaze(); 
TiXmlDocument testDoc; 
testDoc.Parse(mazeS.c_str(), 0, TIXML_ENCODING_UTF8); 


testDoc.SaveFile("ServerTestDoc.xml"); 


//testDoc.SaveFile("testXMLFromString.xml"); 
Tile** theirMaze = readXML(testDoc); 


TiXmlDocument theMaze = maze->mazeToXML(); 
//theMaze.SaveFile("ClientTestWrite.XML"); 
TiXmlPrinter printer; 

theMaze.Accept(&printer); 


string toSend = printer.CStr(); 
cout << toSend << endl; 
s->SendLine(toSend); 



//RENDER STUFF IN THIS LOOP 
bool inOurMaze = false; 
while(boolValues->running) { 


// This next line is where I want to receive the update on position 
// but instead it reads the Maze XML file again, the one I read up 
// above 
string posReceive = s->ReceiveLineUpdate(); 

TiXmlDocument theirPos; 
    theirPos.Parse(posReceive.c_str(), 0, TIXML_ENCODING_UTF8); 

       ... This is where I process the update XML ... 


TiXmlDocument updatePos = maze->updatePositionXML(); 
TiXmlPrinter printerPos; 
updatePos.Accept(&printerPos); 


string posSend = printer.CStr(); 
s->SendLine(posSend); 

[/ code]

Jede Hilfe sehr geschätzt wird. Wenn es oben nicht klar ist, lass mich zusammenfassen.

Ich tausche zuerst eine XML-Datei, die die Maze selbst angibt. Das funktioniert gut. Dann versuche ich, die Update-XML-Dateien auszutauschen, die die Spieler/Feind-Positionen für den anderen Benutzer aktualisieren. Aber wenn ich recv (...) benutze, fängt es an, die Maze-Datei erneut zu lesen, NICHT die Update-Datei. Es ist ... verblüffend.

Oh, und hier ist der Sendecode (sehr einfach):

[code]

s += '\n'; 
send(s_,s.c_str(),s.length(),0); 

[/ code]

wo s_ die Buchse und s.c_str ist die Zeichenfolge das muss gesendet werden (in diesem Fall die verschiedenen XML-Dateien).

+0

Ein bisschen Crunch-Time-Sache, dies für ein Schulprojekt zu tun, lief in diesen Fehler, wenn wir 90% unseren Code getan haben. Morgen morgen Nachmittag ... – user1335049

Antwort

0

Wie @Martin darauf hinweist, ist das Problem definitiv mit dem Code. Wenige Dinge zu überprüfen, sieht aus wie die Daten in den Puffer "ret" gelesen werden und das ist unter Ihrer Kontrolle. Wird es jedes Mal geleert/gelöscht (der Code macht das nicht klar). Wenn das in Ordnung ist, überprüfen Sie den Client-Code, um sicherzustellen, dass die Daten korrekt gesendet werden. Die beste Option ist es, durch Ihre Sende- und Empfangsfunktionen in der IDE zu debuggen, sollten Sie in der Lage sein, was falsch zu erkennen.

Verwandte Themen