0

私は2人のプレイヤーが接続する迷路ゲームの作成に取り組んでいます(1人はホストとして機能し、もう1人はプレイヤーとして機能します)。ここでは、send()関数を使用してXMLデータを文字列として送信しています。(私は事前に作成されたSocketクラスも使用しています。これは非営利活動用であり、著作権を侵害しないことに注意してください。)クライアントとサーバーはWinSock2を使用してWindows7で実行されていることに注意してください。 hパッケージ。

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

recv()が使用するバッファをクリアする方法はありますか?Maze XMLが2回送信されていないのに、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ファイル)です。

4

1 に答える 1

0

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

于 2012-04-16T11:30:38.340 に答える