2013-02-21 2 views
0

소켓을 통해 텍스트 줄을 읽는 기능을 작성하려고합니다. 숙제를 위해 HTTP Server 용으로 작성한 코드의 일부입니다.fprintf가 작동하지 않지만 fputc가 제대로 작동합니까?

fputc을 사용하여 쓰고있을 때 파일에 잘 쓰기 만합니다. 그러나 문자를 버퍼에 복사 한 다음 fprintf을 사용하여 전체 버퍼를 파일에 인쇄하면 출력이없는 것 같습니다. 나는이 다른 기능을 사용하여 시도했다 :

int read_line(int fd, char *buffer, int size) { 
    char *broken_buffer = (char*) malloc(sizeof(char) * 8096); 
    char next = '\0'; 
    char err; 
    int i = 0; 
    FILE *f = fopen("read_line2.txt", "w"); 
    while (i < size - 1 && next != '\n') { 
     err = read(fd, &next, 1); 
     if (err > 0) { 
      if (next == '\r') { 
       err = recv(fd, &next, 1, MSG_PEEK); 
       if (err > 0 && next == '\n') { 
        read(fd, &next, 1); 
       } else { 
        next = '\n'; 
       } 
      } 
      fputc(next, f); // Works 
      broken_buffer[i] = next; 
      buffer[i] = next; 
      i++; 
     } else { 
      next = '\n'; 
     } 
    } 
    broken_buffer[i] = '\0'; 
    buffer[i] = '\0'; 
    FILE *out = fopen("read_line.txt", "w"); 
    fprintf(out, "%s\n", broken_buffer); // Does not work 
    fclose(out); 
    fclose(f); 

    return i; 
} 

편집 :

여기에 코드입니다

int read_socket(int fd, char *buffer, int size) { 
    int bytes_recvd = 0; 
    int retries = 0; 
    int total_recvd = 0; 

    while (retries < MAX_RETRIES && size > 0 && strstr(buffer, ">") == NULL) { 
     bytes_recvd = read(fd, buffer, size); 

     if (bytes_recvd > 0) { 
      buffer += bytes_recvd; 
      size -= bytes_recvd; 
      total_recvd += bytes_recvd; 
     } else { 
      retries++; 
     } 
    } 

    if (bytes_recvd >= 0) { 
     // Last read was not an error, return how many bytes were recvd 
     return total_recvd; 
    } 
    // Last read was an error, return error code 
    return -1; 
} 

그리고 fprintf와 함께이 일을 인쇄 아무런 문제가 없습니다.

EDIT2 : 루프 이후에 i이 어떻게 든 0이라고 생각 했으므로 첫 번째 문자는 '\ 0'으로 덮어 쓰게됩니다. 그러나 루프 내에서 i의 값을 출력하는 디버깅 코드를 넣을 때 최대 22 개까지 증가하는 것을 발견했습니다 (23은 루프가 끊기는 최종 값임). 이것도 어떻게 가능합니까? 결과 문자열은 다음과 같습니다

GET /blah.txt HTTP/1.1 
+0

소켓이 차단되었거나 차단되지 않았습니까? 블로킹 중이며'read' 호출에서 더 이상 수신 할 것이 없다면 블로킹됩니다. –

+0

아, 메모리 누수가 있습니다. 힙에'broken_buffer'를 할당 할 필요가 없으며, 단지 보통 배열을 선언하십시오. –

+0

그 파일을''w "'_overwrites_ 파일로 열면 다음에'read_line'을 호출 할 때 그 파일을 덮어 씁니다. 즉, _last_line 읽기 만 포함합니다 (빈 줄 일 수도 있음). –

답변

0

문제는 서버에 연결되어있는 두 프로세스 (감사, Chrome ...)로 밝혀졌으며 둘 다 같은 파일에 동일한 방식으로 쓰고있었습니다. 코드가 올바르게 작동했습니다.

0

next 지금까지 0의 가치인가? 0이면 그 값은 broken_buffer으로 넘어갑니다. 즉, null을 명시 적으로 입력하기 전에 fprintf은 문자열의 끝에 있다고 생각합니다.

+0

'next'와 ''\ 0 '을 비교하는 수표를 추가하려고 시도했지만 아무런 차이가없는 것처럼 보입니다. fprintf를 사용하여 파일에 올바르게 인쇄하는 다른 기능을 사용했습니다 (이 내용을 기본 게시물로 편집했습니다). 매우 이상합니다. – Darthfett

관련 문제