私は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ファイル)。
私たちのコードを90%行ったときに、このエラーが発生しました。明日の午後になる... – user1335049