2012-04-15 8 views
0

私は2人のプレーヤーが接続する迷路ゲームの作成に取り組んでいます(1つはホスト、もう1つはプレイヤー)。ここでは、send()関数を使用してXMLデータを文字列として送信しています。 (私は既成のSocketクラスも使用しています。これは非営利活動のためのもので、著作権を侵害しないことを意味しています)。クライアント&はWindows 7上でWinSock2を使用しています。 hパッケージ。C++ソケットrecv()は同じ文字列を2回読み込みます(WinSock2)

私が直面している問題はかなり簡単です。私はまずMaze XMLファイルを送信します。これは正しく読み込まれ、迷路を一連のタイルに保存することができます。その後、別のXMLファイルが送信され、他のユーザーのゲームのプレーヤー(および敵)の位置が更新されます。しかし、私はこの行を読み込もうとすると、バッファの先頭から読み込みを開始します。バッファがクリアされていないかのように見えます。

recv()が使用するバッファをクリアする方法はありますか? Maze XMLが2度読み込まれていない他の理由は考えられません。

以下は、XMLを文字単位で受け取るコードです。これはサーバーのコードです。クライアントコードはデータの送受信順序を逆転させます。それが必要か関連しているかはわかりません。

[コード]

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

[/コード]

そして、これは/が異なるXMLファイルを送受信するコードです。

[コード]

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); 

[/コード]

任意の助けを理解されたいです。それが上にはっきりしていない場合は、要約しましょう。

まず、Maze自体の詳細を記述したXMLファイルを交換します。これは正常に動作します。次に、更新XMLファイルを交換しようとします。これは、他のユーザーのプレイヤー/敵の位置を更新します。しかし、私がrecv(...)を使用しようとすると、更新ファイルではなく、Mazeファイルを再度読み始めます。それは...困惑している。

ああ、ここで送信コード(非常に単純な)です:

[コード]

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

[/コード] S_がソケットで、s.c_strが文字列である

は、それは送信する必要があります(この場合、異なるXMLファイル)。

+0

私たちのコードを90%行ったときに、このエラーが発生しました。明日の午後になる... – user1335049

答えて

0

@Martinが指摘しているように、問題は間違いなくコードにあります。チェックすることはほとんどありません。データがバッファ "ret"に読み込まれ、それがあなたのコントロール下にあるように見えます。それは毎回フラッシュ/クリアされていますか(コードはそれを明確にしません)。これが問題ない場合は、クライアントコードを調べて、データが正しく送信されていることを確認してください。 最適なオプションは、IDEで送受信機能をデバッグして、何が間違っているのかを知ることができるはずです。