크래프톤 정글 WIL_Week07 웹서버 만들기

pigpgw·2024년 8월 22일

크래프톤 정글

목록 보기
9/13
post-thumbnail

개요

7주차는 소켓이 무엇인지 공부하고,소켓을 이용하여 간단한 나만의 웹 서버 만들어보는 과제였다. 해당 과제를 진행하려면 cs적인 지식은 물론 c 언어의 다양한 함수들을 알아야했다. 해당 코드들을 공부하면서 정리했던 내용을 작성하고 다음 포스팅에 과제 구현을 포스팅할 예정이다. 시간상 모든 내용을 포스팅할 수 없기에 구현하면서 정리했던 내용이 있는 노션 링크도 추가하겠다.

webproxy-lab 과제 구현

개요

7주차 과제는 소켓의 개념을 학습하고, 이를 활용하여 간단한 웹 서버를 구현하는 것이었다. cs에 관심이 많았던 나로써는 엄청 기대가 많은 주차였다.

과제 구현 계획도

  1. 소켓 기초

    • 소켓의 개념 학습
    • 간단한 클라이언트/서버 구현 (요청과 응답 기능 포함)
  2. HTTP 프로토콜과 웹 서버 구현

    • HTTP 프로토콜 이해
    • 웹 서버 구현 (클라이언트 요청 처리, 응답 생성 및 전송)
    • 웹 서버의 주요 기능 분석
  3. 단계별 웹 서버 구현

    • '컴퓨터 시스템' 교재 11장 참고
    • 기본 코드를 바탕으로 단계적 구현
  4. 프록시 서버 구현 (고급)

    • 브라우저와 웹 서버 사이에서 중개 역할
    • 순차적 요청 처리, 병렬 요청 처리, 요청 캐싱

소켓 프로그래밍 기초

주요 소켓 함수

각 코드에대한 설명은 노션 참고

함수설명
socket소켓 생성
connect서버와 연결 수립
bind소켓에 주소 할당
listen연결 요청 대기
accept클라이언트 연결 수락

Tiny Web Server 구현

주요 함수

각 코드에대한 설명은 노션 참고

  1. main: 서버의 메인 루프 관리
  2. doit: HTTP 요청 처리
  3. serve_static: 정적 콘텐츠 제공
  4. serve_dynamic: 동적 콘텐츠 제공
  5. clienterror: 에러 메시지 전송
  6. read_requesthdrs: 요청 헤더 읽기
  7. parse_uri: URI 파싱

과제 수행 내용

  1. MPG 비디오 파일 처리 (11.7)

    void get_filetype(char *filename, char *filetype) {
        // ... 기존 코드 ...
        else if (strstr(filename, ".mp4"))
            strcpy(filetype, "video/mp4");
        // ... 기타 비디오 형식 추가 ...
    }
  2. malloc을 이용한 정적 콘텐츠 처리 (11.9)

    void serve_static(int fd, char *filename, int filesize) {
        // ... 기존 코드 ...
        srcp = (char *)malloc(filesize);
        rio_readn(srcfd, srcp, filesize);
        Close(srcfd);
        rio_writen(fd, srcp, filesize);
        free(srcp);
    }
  3. HTTP HEAD 메소드 지원 (11.11)

    void doit(int fd) {
        // ... 기존 코드 ...
        if (strcasecmp(method, "GET") && strcasecmp(method, "HEAD")) {
            clienterror(fd, method, "501", "Not implemented", "Tiny does not implement this method");
            return;
        }
        // ... 나머지 코드 ...
    }

CGI 프로그램 구현 (adder.c)

간단한 덧셈 기능을 수행하는 CGI 프로그램을 구현했습니다.

테스트 및 검증

telnet을 사용하여 HEAD 메소드를 테스트했습니다:

telnet localhost 8000
HEAD / HTTP/1.1
Host: localhost

결론

이번 과제를 통해 소켓 프로그래밍의 기본 원리를 이해하고, 웹 서버를 구현해볼 수 있었다. 프록시는 시간상 구현하지 못해서 아쉬웠는데 그래도 후회는 없는 주차였다. 정적/동적 콘텐츠 처리, HTTP 메소드 구현, CGI 프로그램 작성 등 다양한 웹 서버 기능을 직접 구현함으로써 네트워크 프로그래밍에 대한 실질적인 경험을 쌓으면서 웹 서버의 내부 동작 원리를 이해하는 도움이 되었다.

profile
https://www.pigpgw.cloud 로 이전합니다~

0개의 댓글