私は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ファイル)です。