소켓을 통해 텍스트 줄을 읽는 기능을 작성하려고합니다. 숙제를 위해 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
소켓이 차단되었거나 차단되지 않았습니까? 블로킹 중이며'read' 호출에서 더 이상 수신 할 것이 없다면 블로킹됩니다. –
아, 메모리 누수가 있습니다. 힙에'broken_buffer'를 할당 할 필요가 없으며, 단지 보통 배열을 선언하십시오. –
그 파일을''w "'_overwrites_ 파일로 열면 다음에'read_line'을 호출 할 때 그 파일을 덮어 씁니다. 즉, _last_line 읽기 만 포함합니다 (빈 줄 일 수도 있음). –