2012-04-15 4 views
0

두 명의 플레이어가 연결되어있는 미로 게임을 만드는 중입니다. 하나는 호스트이고 다른 하나는 플레이어입니다. 여기서는 XML 데이터를 send() 함수를 사용하여 문자열로 보냅니다. (저는 미리 만들어진 Socket 클래스를 사용하고 있습니다. 이것은 비영리 활동을 위해 저작권이 침해되지 않는다는 것을 의미합니다.) 클라이언트 & 서버는 WinSock2를 사용하여 Windows 7에서 실행됩니다. h 패키지.C++ 소켓 recv()는 동일한 문자열을 두 번 읽습니다 (WinSock2)

내가 만나는 문제는 상당히 간단합니다. 우선 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

학교 프로젝트에서이 작업을 수행 할 때의 위기는 우리가 코드를 90 % 완료했을 때이 오류가 발생했습니다. 내일 오후에 ... – user1335049

답변

0

@Martin이 지적했듯이 문제는 분명히 코드와 관련이 있습니다. 확인해야 할 사항은 데이터가 버퍼 "ret"로 읽혀지고 사용자가 제어 할 수있는 것처럼 보입니다. 그 때마다 플러시/지워지고있다 (코드는 명확하지 않다). 괜찮 으면 클라이언트 코드를 검사하여 데이터가 올바르게 전송되는지 확인하십시오. 최상의 옵션은 IDE에서 보내기 및 수신 기능을 통해 디버그하는 것이므로 잘못된 점을 발견 할 수 있어야합니다.

관련 문제