[week 07] Tiny web server 분석 - sprintf와 printf의 차이

Jin Lee·2021년 12월 21일
0
post-thumbnail

버퍼(buffer, 문화어: 완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역

sprintf : buffer 라는 메모리 공간에 출력
printf : 표준입출력으로 모니터에 출력

Tiny webserver 에서 발췌한 내용으로 정적 컨텐츠에 대한 내용을 처리해 주는 부분의 일부이다.

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가 실행되는 시점이다.

ref
1. https://dojang.io/mod/page/view.php?id=352

profile
깃허브 : https://github.com/jinlee9270

0개의 댓글