Tiny 웹 서버는 네트워크 프로그래밍의 핵심 개념을 통합하여
실제 웹 서버의 기본적인 기능을 구현한 간단한 서버이다.
- 목적 :
- 웹 서버 구현의 핵심 개념을 보여주기 위해 설계.
- 프로세스 제어, 유닉스 I/O 작업, 소켓 사용, HTTP 요청 처리 개념
- 핵심 구성 요소 :
- 프로세스 제어 : 들어오는 연결을 처리하기 위해 새로운 프로세스 생성하며,
기본적인 프로세스 생성 및 관리 - 유닉스 I/O : 데이터 읽기 및 쓰기
- 소켓 인터페이스 : 네트워크 연결 관리하기 위해 구현
- HTTP 프로토콜 : HTTP 요청을 파싱하고 응답을 처리하여 정적 컨텐츠와
동적 CGI 요청을 모두 처리
- 프로세스 제어 : 들어오는 연결을 처리하기 위해 새로운 프로세스 생성하며,
주요 함수 및 개념
- Open_listenfd :
- 리스닝 소켓을 생성하고 지정된 포트에 바인딩. 서버가 들어오는 연결을 수락할 준비
- Accept :
- 클라이언트의 연결 요청을 수락하여 클라이언트-서버 통신을 위한 소켓 생성
- read_requesthdrs :
- 클라이언트로부터 HTTP 요청 헤드를 읽음. 헤더를 처리하여 요청 처리를 준비
- parse_uri :
- URI를 분석하여 요청이 정적 컨텐츠를 위한 것인지, 동적 CGI 스크립트에 대한 것인지 결정.
요청을 적절한 처리기로 라우팅하는 데 사용
- URI를 분석하여 요청이 정적 컨텐츠를 위한 것인지, 동적 CGI 스크립트에 대한 것인지 결정.
- serve_static :
- 정적 컨텐츠(HTML파일, 이미지) 제공. 요청된 파일을 디스크에서 읽어 클라에게 전송.
- serve_dynamic :
- CGI 스크립트를 실행하여 동적 컨텐츠를 제공. 환경 변수를 설정하고 execve를 사용하여
스크립트를 실행하며, 스크립트의 출력을 클라에게 전송
- CGI 스크립트를 실행하여 동적 컨텐츠를 제공. 환경 변수를 설정하고 execve를 사용하여
- clienterr :
- 요청에 문제가 있을 경우 클라에게 오류 응답을 보냅니다.
파일을 찾을 수 없거나 지원하지 않는 메소드에 대한 응답 처리
- 요청에 문제가 있을 경우 클라에게 오류 응답을 보냅니다.
웹 서버의 동작 방식
- 서버 시작 :
- 서버는 사용자가 지정한 포트에 바인딩된 리스닝 소켓을 생성하여 초기화
- 연결 수락 :
- 무한 루프에 들어가서 클라이언트로부터 오는 연결 요청을 계속 수락
- 요청 처리 :
- 수락된 연결에 대해 HTTP 요청을 읽고, URI를 파싱하여 요청된 콘텐츠 유형(정/동적)
에 따라 적절한 처리 함수를 호출
- 수락된 연결에 대해 HTTP 요청을 읽고, URI를 파싱하여 요청된 콘텐츠 유형(정/동적)
- 컨텐츠 제공 :
- 정적 컨텐츠는 파일 시스템에서 읽어 클라에게 전송
- 동적 컨텐츠는 CGI 스크립트를 실행하여 그 출력을 클라에게 전송
- 연결 종료 :
- 요청 처리가 끝난 후, 서버는 클라와의 연결을 종료하고 새로운 연결 기다림
예제 코드 요약
- main 함수 : 서버 설정, 연결 수락, 요청 처리하는 루프 실행
- doit 함수 : 각 요청을 처리하여 요청 라인을 읽고 URI를 파싱하며, 정/동적 컨텐츠 제공
- serve_static, serve_dynamic : 정적 및 동적 컨텐츠 제공 처리
- clienterror : 요청을 처리할 수 없는 경우 오류 응답을 클라에게 보냄
'C언어 > Tiny 웹 서버' 카테고리의 다른 글
Tiny 구현 (2) | 2024.09.18 |
---|---|
network 개요 (2) | 2024.09.16 |