버퍼(buffer, 문화어: 완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역
sprintf : buffer 라는 메모리 공간에 출력
printf : 표준입출력으로 모니터에 출력
void serve_static(int fd, char *filename, int filesize, char *method) {
int srcfd;
char *srcp, filetype[MAXLINE], buf[MAXBUF], *fbuf;
/* Send response headers to client */
get_filetype(filename, filetype);
sprintf(buf, "HTTP/1.0 200 OK\r\n");
sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
sprintf(buf, "%sConnection: close\r\n", buf);
sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);
/* writen = client(텔넷)에서 출력됨*/
Rio_writen(fd, buf, strlen(buf));
/* 서버 쪽에 출력 */
printf("Response headers:\n");
printf("%s", buf);
if (!strcasecmp(method, "HEAD"))
return;
}
7번째 줄이 완료된 시점의 buf는 HTTP/1.0 200 OK\r\n
8번째 줄이 완료된 시점의 buf 에는 7번째 줄에서 완료된 HTTP/1.0 200 OK\r\n가 들어있는 상태에 HTTP/1.0 200 OK\r\nServer: Tiny Web Server\r\n를 덮어쓴다.
이런 과정이 반복 되어
7~11 번째 줄이 완료된 시점의 buf는 HTTP/1.0 200 OK\r\nServer: Tiny Web Server\r\nConnection: close\r\nContent-length: filesize\r\nContent-type: filetype\r\n\r\n 이 들어 있게 된다.
하지만 이는 눈에 보이지 않는데 sprintf를 사용해 버퍼에 출력했기 때문이다.
우리가 눈으로 buf에 담겨있는 string을 볼 수있는 시점은 18번째 줄에 printf가 실행되는 시점이다.