我正在制作迷宫游戏,其中两个玩家连接(一个充当主机,另一个充当玩家)。在这里,我使用send()函数将XML数据作为字符串发送。 (我也使用预先制作的Socket类,请记住这是针对非营利性活动的,这意味着它不会破坏版权。)请记住客户端&服务器使用WinSock2.h软件包在Windows 7上运行。
我遇到的问题相当简单。我首先发送Maze XML文件,这个文件正确读取并能够将迷宫保存在一系列图块中。在此之后,发送另一个XML文件,更新另一个用户游戏的玩家(和敌人)的位置。但是,当我尝试读取这一行时,它开始从缓冲区的开头读取,似乎缓冲区没有被清除,因为它再次开始读取Maze XML文件。
有没有办法清除recv()使用的缓冲区?我想不出任何其他原因导致Maze XML被两次读取,而不是两次被发送。
下面是逐字符接收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 :(得分:0)
正如@Martin指出的那样,问题肯定在于代码。很难检查的东西,看起来数据被读入缓冲区“ret”并且在你的控制之下。是每次刷新/清除(代码没有说清楚)。如果没问题,请检查客户端代码以确保正确发送数据。 最好的选择是在IDE中通过发送和接收函数进行调试,你应该能够发现错误。