[TIL/크래프톤 정글9기] 57일차 (Week 08 Tiny 서버 숙제문제)

blueprint·2025년 7월 7일

크래프톤정글9기

목록 보기
47/55

숙제 문제

11.6 C

Tiny를 수정해서 모든 요청라인과 요청 헤더를 echo하도록 하라
C. Tiny의 출력을 조사해서 여러분이 사용하는 브라우저의 HTTP 버전을 확인해라.

  • 서버 접속
  • 서버 접속 후 서버 로그의 브라우저 HTTP 버전 확인.
  • 크롬 HTTP/1.1

11.7

Tiny를 확장해서 MPG 비디오 파을을 처리하도록 하시오. 실제 브라우저를 사용해서 결과 체크하시오.

  • MPG 파일 테스트 결과 브라우저에서 해당 포맷을 지원하지 않아 mp4로 테스트 했다.
  • 파일 타입에 mp4 파일 타입 추가
  • 브라우저에서 영상 재생 확인

11.9

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

메모리 매핑 방식(Mmap)

  • 메모리 할당: 파일을 가상 메모리에 직접 매핑
  • 데이터 로딩: 필요할 때만 페이지 단위로 로딩 (lazy loading)
  • 메모리 사용: 실제 사용하는 부분만 물리 메모리 사용
  • 성능: 큰 파일에 효율적, 시스템 콜 최소화
  • 안전성: 파일 크기 제한 없음 (가상 메모리 사용)

버퍼 기반 방식(malloc)

  • 메모리 할당: malloc()으로 전체 파일 크기만큼 할당
  • 데이터 로딩: 파일 전체를 한 번에 메모리로 읽기
  • 메모리 사용: 파일 크기만큼 물리 메모리 사용
  • 성능: 작은 파일에 효율적, 큰 파일은 메모리 부족 가능
  • 안전성: 메모리 할당 실패 가능성

11.10

A. rmfla 11.27의 CGI adder 함수에 대한 HTML 형식을 작성하시오. 이 형식은 사용자가 함께 더할 두 개의 숫자로 채우는 두개의 텍스트 상자를 포홈해야 한다. 여러분의 형식은 GET 메소드를 사용해서 컨텐츠를 요청해야 한다.

B. 실제 브라우저를 사용해서 Tiny로부터 이 형식을 요청하고, 채운 형식을 Tin에 보내고, adder가 생성한 동적 컨텐츠를 표시하는 방법으로 작업 체크하시오.

<html>
<head><title>Adder</title></head>
<body>
    <form id="adderForm">
        <p>Enter two numbers to add:</p>
        <input type="text" id="n1">
        <input type="text" id="n2">
        <input type="submit" value="Add">
    </form>

    <script>
        document.getElementById('adderForm').addEventListener('submit', function(event) {
            // Prevent the default form submission
            event.preventDefault();

            // Get the values from the input fields
            var val1 = document.getElementById('n1').value;
            var val2 = document.getElementById('n2').value;

            // Construct the custom query string that adder.c expects
            var queryString = val1 + '&' + val2;

            // Construct the final URL and redirect
            window.location.href = '/cgi-bin/adder?' + queryString;
        });
    </script>
</body>
</html>


두 입력 박스에 숫자를 넣고 제출을 누르면 adder 가 실행된다

처음 자바스크립트를 작성하지 않고 했을 때는 cgi-bin/adder?n1=123&n2=123 키 밸류를 넣게 되어 인식을 못해 자바스크립트를 추가해 밸류만 뽑았다. cgi-bin/adder?123&123

11.11

Tiny를 확장해서 HTTP HEAD 메소드를 지원하도록 하라. Telnet을 웹 클라이언트로 사용해서 작업 결과 체크하시오.
Tiny 웹 서버에 HTTP HEAD 메서드를 지원하도록 확장하는 문제로 HEAD는 response body를 반환하지 않고 헤더만 반환하는 메서드다.

if (strcasecmp(method, "GET") && strcasecmp(method, "HEAD")) { ... }

  // HEAD 메소드인 경우 플래그 설정
  if (strcasecmp(method, "HEAD") == 0) {
      is_head = 1;
  } else { // GET 메소드인 경우
      is_head = 0;
  }
  • 메서드 체크 추가
if (!is_head) {
    // 파일 내용 전송 (HEAD가 아닐 때만)
    srcp = malloc(filesize);
    Rio_readn(srcfd, srcp, filesize);
    Rio_writen(fd, srcp, filesize);
    free(srcp);
}
  • 정적 파일 헤더 처리 추가
if (is_head) {
    // HEAD 요청: 표준 출력을 /dev/null로 리다이렉션
    int devnull_fd = Open("/dev/null", O_WRONLY, 0);
    Dup2(devnull_fd, STDOUT_FILENO);
} else {
    // GET 요청: 클라이언트 소켓으로 리다이렉션
    Dup2(fd, STDOUT_FILENO);
}
  • 동적 파일 헤더 처리 추가

  • 결과 화면 헤더만 출력되는 것을 확인 가능

0개의 댓글