SW 사관학교 정글(Jungle)/컴퓨터 시스템(CSAPP)

[CSAPP] 11장 숙제(Homework) 문제 정답

jinsang-2 2024. 9. 19. 11:33

11.7) Tiny를 확장해서 MPG 비디오 파일을 처리하도록 하시오. 실제 브라우저를 사용해 여러분의 결과를 체크하시오(MPG 대신 mp4)

1.get_filetype에 mp4 추가하기

 

//MIME type을 읽고 값을 *filetype에 저장
void get_filetype(char *filename, char *filetype)
{
    if (strstr(filename, ".html"))  // 파일 확장자가 .html이면
        strcpy(filetype, "text/html");  // MIME 타입을 text/html로 설정
    else if (strstr(filename, ".gif"))  // .gif 파일이면
        strcpy(filetype, "image/gif");  // MIME 타입을 image/gif로 설정
    else if (strstr(filename, ".png"))  // .png 파일이면
        strcpy(filetype, "image/png");  // MIME 타입을 image/png로 설정
    else if (strstr(filename, ".jpg"))  // .jpg 파일이면
        strcpy(filetype, "image/jpeg");  // MIME 타입을 image/jpeg로 설정
    else if (strstr(filename, ".mp4"))  // .mp4 파일이면
        strcpy(filetype, "video/mp4");  // MIME 타입을 video/mp4로 설정
    else
        strcpy(filetype, "text/plain");  // 알 수 없는 확장자일 경우 기본 MIME 타입인 text/plain을 설정
}

 

2. tiny.c 파일 동일 위치에 mp4 비디오 추가

 

3. home.html에 mp4 실행을 위한 태그 추가
<html>
<head><title>test</title></head>
<body> 
<img align="middle" src="godzilla.gif">
Dave O'Hallaron
<video width="640" height="480" controls>
    <source src="video.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

</body>
</html>
4. 결과

 

(참고) 더 deep 하게 가보려면
https://jinsang-2.tistory.com/88
 

[C언어][csapp] Tiny서버 구현 시 SIGPIPE 상황 발생 해결 (문제 11.7과 연결)

https://jinsang-2.tistory.com/87  링크 11.7의 문제의 연장선이라 볼 수 있다.  [CSAPP] 11장 숙제(Homework) 문제 정답11.7) Tiny를 확장해서 MPG 비디오 파일을 처리하도록 하시오. 실제 브라우저를 사용해 여러

jinsang-2.tistory.com

 

11.9) TINY를 수정해서 정적 컨텐츠 처리할 때 요청한 파일을 mmap과 rio_readn 대신에 malloc, rio_readn, rio_writen을 사용해서 연결 식별자에게 복사하도록 하시오.

이전부분 주석처리
void serve_static(int fd, char *filename, int filesize, char *method) 
{
...
    // 클라이언트에 응답 본문 전송
    srcfd = Open(filename, O_RDONLY, 0);  // 파일을 읽기 전용으로 열어 파일 디스크립터를 얻음
    // srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);  // 파일을 메모리에 매핑
    srcp = (char *)malloc(filesize) ;  // malloc 사용, 데이터 할당
    Rio_readn(srcfd,srcp,filesize); // srcfd에서 filesize 바이트만큼의 데이터를 srcp에 읽어옴
    Close(srcfd);  // 파일 디스크립터를 닫음 (파일을 더 이상 사용할 필요 없음)
    Rio_writen(fd, srcp, filesize);  // 메모리에 매핑된 파일 내용을 클라이언트에 전송
    // Munmap(srcp, filesize);  // 파일의 메모리 매핑을 해제
    free(srcp);
}

 

11.10) 두 개의 숫자 html에서 입력받고 더해서 display

home.html에 form, input 태그 사용

http://{서버 주소}/cgi-bin/adder?A=123&B=456

input 태그에 name 속성을 사용해야 위에처럼 uri이 서버에 넘어간다. 

<form action="/cgi-bin/adder" method="GET">
	<p>a: <input name="A" /></p>
    <p>b: <input name="B" /></p>
    <input type="submit">
</form>

 

adder.c 수정
 char *buf, *p, *A,*B; // A,B 추가해주기
 
...

    A = strchr(buf, 'A');
    B = strchr(buf, 'B');
    p = strchr(buf, '&');
    *p = '\0';
    strcpy(arg1, A+2);
    strcpy(arg2, B+2);
    n1 = atoi(arg1);
    n2 = atoi(arg2);
  • 해당 buf에는 A=123&B=456 값이 담겨져 있음
  • '&' null 로 만들고 'A'위치 찾고 'B'위치 찾고 strcpy 때리믄 됨

11.11 Tiny 확장 , HTTP HEAD 메소드 지원하게 구현

 doit 함수 수정
    // 메서드가 "GET", "HEAD"가 아닌 경우 에러 처리
    if (strcasecmp(method, "GET") && strcasecmp(method, "HEAD")) {                     
        clienterror(fd, method, "501", "Not Implemented", "Tiny does not implement this method"); // 지원되지 않는 메서드에 대한 에러 메시지 전송
        return;
    }
  • strcasecmp는 해당 인자가 있으면 0을 반환함
serve_static에 인자에 method 추가
void serve_static(int fd, char *filename, int filesize, char *method) 
{
...
// 메소드 헤드 처리
    if (strcasecmp(method, "HEAD") == 0)
      return;
}
  • 이후 헤드 메소드 처리
서버 실행 후 새로운 다른 터미널에 밑에 명령어를 치자
telnet localhost 80
입력 후 
HEAD / HTTP/1.1
입력 후 엔터