2012-10-11 3 views
0

C++ (서버) 및 PHP (클라이언트)의 소켓에 문제가 있습니다. 아래는 코드입니다. 문제는 pClient-> send() 함수가 -1 또는 0을 반환해야한다는 것입니다 (실패로 인해 클라이언트가 연결 해제 될 때마다). 그러나 그렇지 않습니다. 따라서 루프를 중단 할 수 없으며 프로그램이이 함수에서 실패합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 네가 나를 도울 수 있기를 바랍니다.클라이언트 연결 해제 후 CSimpleSocket 오류가 발생했습니다.

int sentSucces=0; 
char szData[MAX_PACKET]; 
memset(szData, 0, MAX_PACKET); 

CPassiveSocket socket; 
CActiveSocket *pClient = NULL; 
sendInterval = 10; 
socket.Initialize(); 
socket.Listen((const uint8 *) "127.0.0.1", 9876); 
socket.SetNonblocking(); //if no connection in queue, don't wait (accept()) 

while (1) { 
    //check queue for connections. 
    if ((pClient = socket.Accept()) != NULL) { 
     pClient->SetNonblocking(); 
     cout << "++ connected\n"; 
     while (1) { 
      // Receive request from the client. 
      cout << "- receiving....\n"; 
      if (pClient->Receive(MAX_PACKET) > 0) { 
       cout << "-- received\n"; 
       strncpy(szData, (const char *) pClient->GetData(), pClient->GetBytesReceived()); 
       cout << "-- +: " << szData << "\n"; 
       //clear memory of szData 
       memset(szData, 0, MAX_PACKET); 

      } else { 
       cout << "-- NOT received\n"; 
      } 

      string bericht = "hallo"; 
      cout << "sending....\n"; 
      sentSucces = pClient->Send((const uint8 *) bericht.c_str(), strlen(bericht.c_str())); 
      cout << "++ send:" << sentSucces << "\n"; 
      if (sentSucces < 1) break; 
      sleep(4); 
     } 
     cout << "++ disconnecting...\n"; 
     pClient->Close(); 
     cout << "++ disconnected\n"; 
    } else { 
     // cout << "++ no connections\n"; 
    } 
    usleep(10000); 
} 
+1

TCP를 통해 어떤 프로토콜을 구현합니까? 프로토콜 사양에 따라 클라이언트가 서버 단절을 감지해야한다고 어떻게 알 수 있습니까? (당신이 당신의 프로토콜을 문서화하지 않았다면 그것은 당신의 문제입니다. 당신이 TCP 전문가 일 때까지 당신이 구현 한 모든 프로토콜을 문서화해야합니다. 코드는 코드의 다른 부분과도 작동합니다.) 또한,'Receive' 코드 경로에서 어떤 오류 케이스도 처리하지 않으시겠습니까? –

답변

1

코드는 Receive으로 영원히 기다립니다. 그렇게하고 싶지 않으면하지 마십시오. Send 함수가 오류를 반환하지 않는 이유는 절대 도착하지 않기 때문입니다. 영원히 Receive에 대기합니다.

당신이 구현하고있는 프로토콜이 무엇이든,이 스펙은 연결의 끝이 영원히 데이터를 수신하려고 기다려야한다고 말합니까? 그렇다면 깨졌습니다. 그렇지 않으면 코드가 손상됩니다. 프로토콜 사양이없는 경우 하나를 작성해야합니다. 그렇지 않으면 모든 코드가 운이 좋게 만 작동합니다.

TCP 프로토콜은 송신 측에서 결국 연결이 끊어지는 것을 보증합니다. 그러나 그것은 영원히 데이터를 받기를 기다리는쪽에 대해서는 보장하지 않습니다. 상대방이 아무것도 보내지 않고 사라지지 않는다면, 당신은 여전히 ​​영원히 기다릴 것입니다. TCP를 통해 작동하는 프로토콜을 디자인 할 때는 프로토콜 설계에서이를 고려해야합니다. 이것은 한 줄의 코드라도 작성되기 전에 해결되었을 것입니다.

+0

pClient는 비 차단으로 설정되어 있으므로 수신 대기하지 않습니다. 충돌 전엔 "보내는 중 ..."이 인쇄되기 때문에 나는 그것을 볼 수 있습니다. – Rogier

+0

아, 그러면 코드가 몇 분 동안 돌고 있지만 보내기 시간이 초과되면 결국 실패합니다. 기다린 지 얼마나 됐니? –

+0

클라이언트 연결이 끊어진 후 거의 바로 실패합니다. – Rogier

관련 문제