2013-04-10 5 views
0

저는 TCP를 통해 파일에서 호스트 컴퓨터로 제어 명령을 보내고 응답을받는 cpp에 콘솔 응용 프로그램을 작성하고 있습니다. 모든 정보가 화면에 표시되고 파일에 기록되며 이는 실제 문제입니다. 고정 길이를 설정하려고해도 출력 문자열에 어떤 이유로 든 정크가 저장되어있는 것으로 보입니다.C++ Winsock recv() buffer junk

편집 : 코드를 정리하고 recv()의 반환 값을 처리했습니다. 내가 아직 얻지 못하는 유일한 점은 내 로그 파일의 두 번째 recv 줄이 정크로 가득 차 있다는 것입니다. 어쩌면 너희 중 한 명이 문제를 발견 할 수있을 것이다.

 string cmd=""; 
     char *sendstr=(char*)cmd.c_str(); 
     fflush(stdin); 
     int n = 1, total = 0; 
     char temp[1024]; 
     string inStr; 
     if(cmdin.is_open()) 
     {   
      while(!cmdin.eof()) 
      { 
       total=0; 
       cmd=fread(); 
       send(serverPC, sendstr, (int)strlen(sendstr),0); 
       n=recv(serverPC,&temp[total],sizeof(temp)-total-1,0); // FIX THIS 
       total+=n; 
       temp[total]='\0'; 
       inStr=temp; 
       fwrite(inStr,cmd); 
      } 
      cout << "Data successfully sent!\n"; 
     } 
     else{ 
      cerr<<"can't find 'cmd.cfg' file"<<endl; 
     } 

출력은 내가 기대 :

<11:40:00> INIT 
received: VELO=0.00km/h DOT=FORW 
---- 

이 내가 무엇을 얻을 :는 TCP 수신기를 작성할 때

<10:05:56> INIT 
received: VELO=0.00km/h DOT=FORW 
---- 
<10:05:56> VELO=50.00 
received: VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h 
DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW 
VELO=0.00km/h DOT=FORW 
---- 
<10:05:56> VELO=100.00 
received: VELO=50.00km/h DOT=FORW 
---- 
<10:05:56> DOT=BACK 
received: VELO=50.00km/h DOT=FORW 
+0

데이터 처리와 별도의 네트워킹 지원. 코드를 함수로 나눕니다. 그런 다음 해당 기능을 사용하여 주 코드를 다시 작성하십시오. 그것이 읽히는 것은 매우 귀찮습니다. – Dariusz

+0

나는 Dariusz와 기능에 대해 동의한다. 코드를 읽는 것은 매우 어렵습니다. 또한 tbuf의 길이에 대해 상수 값 대신 sizeof를 사용하거나 정의를 수행해야합니다. – DAB

+0

동의해야합니다 ... 내 코드를 조금 엉망으로 만든 것처럼 보입니다. – Madmob

답변

2

핵심 포인트는 기억 TCP이라고한다 데이터 스트림으로 간주됩니다. 이것은 당신이 수행 할 때 데이터의 N 바이트의 패킷을 전송 뭔가로부터받은 것을 의미합니다, 당신은받을 수 있습니다 : N 바이트의 데이터를보다

  • 더 많은 데이터의 N 바이트 이상의
  • 적은 데이터의

    • N 바이트

    연결 해제, 버퍼 오버 플로우 또는 기타 오류가 없다고 가정하면 서버는 보내는 순서대로 항상 메시지를 수신하지만 메시지는 수신 측에서 잘 리거나 연결될 수 있습니다. 그것은 많은 이유 중 하나입니다 [표창장이 필요하십니까?] 사용자 정의 TCP 프로토콜은 길이 필드 (수신해야하는 데이터의 양을 알 수 있도록) 또는 데이터의 끝을 나타내는 방법을 포함합니다. 그렇게하면 수신자는 적절한 양을 수신 할 때까지 루프를 돌릴 수 있고 나머지는 다음 수신을 위해 TCP 버퍼에 남겨 둘 수 있습니다.

    당신이 "쓰레기"를 보았다고해도, 그것은 나에게 쓰레기처럼 보이지 않습니다. 여러 개의 데이터 패킷이 하나로 연결되어있는 것처럼 보입니다.

  • 관련 문제