2012-02-02 3 views
0

내 서버가 클라이언트에 패킷을 보내고 있지만 두 번째 패킷은 표시되지 않습니다. 내 소켓이 차단 유형 인 경우 왜 이런 일이 발생하는지 알 수 없습니다.클라이언트와 서버간에 동기화를 가져 오는 방법

 while(1){ 
      memset(buf,0,1024); 
      numbytes=0; 

      if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) { 
        perror("recv"); 
        exit(1); 
       } 
      buf[numbytes] = '\0'; 
      printf("%s\n",buf); 
      fflush(stdout); 
      } 
    fclose(fp); 
    close(sockfd); 
+1

* 두 번 받으려고한다는 것은 무엇을 의미합니까 *? 질문을 명확하게 설명해 주시겠습니까? – cnicutar

+0

Wireshark는 이런 상황에서 당신을 도울 수있는 편리한 도구입니다. – stdcall

+0

루프가 두 번 반복되는 동안 처음에는 서버에서 두 번째로 보내는 데이터가 있습니다.하지만 null은 나에게 차단해야하며 데이터를 기다려야합니다. 서버 측에서 왔습니다. – tod

답변

1

서버가 빈 문자열을 보내고 있기 때문에 상황이 발생할 수 있습니다. 따라서 클라이언트는 '\0' 문자를 받았기 때문에 차단하지 않으며 빈 문자열이므로 아무 것도 인쇄하지 않습니다.

두 번째 이유는 서버가 연결을 종료했기 때문일 수 있습니다. 이 경우 numbytes의 값은 0이며 클라이언트는 버퍼에 빈 문자열로 끝나기 때문에 아무 것도 인쇄하지 않습니다. 코드와

한 가지 문제는 서버가 1024 바이트 이상을 보내는 경우, numbytes 1024에 동일하게 goign되어 있고 버퍼 크기는 또한 당신은 막을 수 1024 같은 경우는 표현 buf[numbytes]이 분할 오류가 발생할 것입니다 이 문제는 1024 대신 1023을 수신함으로써 발생합니다.

+0

아니면 데이터를 문자열이 아닌 바이트로 처리 할 수 ​​있습니다. 그는'printf ("%. * s", numbytes, buf)'또는'fwrite (buf, 1, numbytes, stdout)'를 시도 할 수있다. –

관련 문제