繁体   English   中英

C ++套接字recv()两次读取相同的字符串(WinSock2)

[英]C++ Socket recv() reads the same string twice (WinSock2)

我正在创建一个迷宫游戏,其中两个玩家连接(一个充当主机,另一个充当玩家)。 在此,我使用send()函数将XML数据作为字符串发送。 (我也使用了预制的Socket类,请记住这是针对非营利活动的,这意味着它不会破坏版权。)请记住,客户端和服务器使用WinSock2在Windows 7上运行。 h包。

我遇到的问题非常简单。 我首先发送迷宫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);

[/码]

任何帮助表示赞赏。 如果还不清楚,让我总结一下。

首先,我交换一个详细描述迷宫本身的XML文件。 这很好。 然后,我尝试交换更新XML文件,以更新其他用户的播放器/敌人位置。 但是,当我尝试使用recv(...)时,它将开始再次读取Maze文件,而不是更新文件。 令人困惑。

哦,这是发送代码(非常简单):

[码]

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

[/码]

其中s_是套接字,而s.c_str是需要发送的字符串(在这种情况下,是不同的XML文件)。

正如@Martin所指出的,问题肯定与代码有关。 几乎没有什么要检查的,好像数据已读入缓冲区“ ret”一样,这在您的控制之下。 是否每次都刷新/清除该代码(代码未将其清除)。 如果可以,请检查客户端代码以确保正确发送数据。 最好的选择是通过IDE中的发送和接收功能进行调试,您应该能够发现问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM