
7주차는 소켓이 무엇인지 공부하고,소켓을 이용하여 간단한 나만의 웹 서버 만들어보는 과제였다. 해당 과제를 진행하려면 cs적인 지식은 물론 c 언어의 다양한 함수들을 알아야했다. 해당 코드들을 공부하면서 정리했던 내용을 작성하고 다음 포스팅에 과제 구현을 포스팅할 예정이다. 시간상 모든 내용을 포스팅할 수 없기에 구현하면서 정리했던 내용이 있는 노션 링크도 추가하겠다.
7주차 과제는 소켓의 개념을 학습하고, 이를 활용하여 간단한 웹 서버를 구현하는 것이었다. cs에 관심이 많았던 나로써는 엄청 기대가 많은 주차였다.
소켓 기초
HTTP 프로토콜과 웹 서버 구현
단계별 웹 서버 구현
프록시 서버 구현 (고급)
각 코드에대한 설명은 노션 참고
| 함수 | 설명 |
|---|---|
| socket | 소켓 생성 |
| connect | 서버와 연결 수립 |
| bind | 소켓에 주소 할당 |
| listen | 연결 요청 대기 |
| accept | 클라이언트 연결 수락 |
각 코드에대한 설명은 노션 참고
main: 서버의 메인 루프 관리doit: HTTP 요청 처리serve_static: 정적 콘텐츠 제공serve_dynamic: 동적 콘텐츠 제공clienterror: 에러 메시지 전송read_requesthdrs: 요청 헤더 읽기parse_uri: URI 파싱MPG 비디오 파일 처리 (11.7)
void get_filetype(char *filename, char *filetype) {
// ... 기존 코드 ...
else if (strstr(filename, ".mp4"))
strcpy(filetype, "video/mp4");
// ... 기타 비디오 형식 추가 ...
}
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);
}
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 프로그램을 구현했습니다.
telnet을 사용하여 HEAD 메소드를 테스트했습니다:
telnet localhost 8000
HEAD / HTTP/1.1
Host: localhost
이번 과제를 통해 소켓 프로그래밍의 기본 원리를 이해하고, 웹 서버를 구현해볼 수 있었다. 프록시는 시간상 구현하지 못해서 아쉬웠는데 그래도 후회는 없는 주차였다. 정적/동적 콘텐츠 처리, HTTP 메소드 구현, CGI 프로그램 작성 등 다양한 웹 서버 기능을 직접 구현함으로써 네트워크 프로그래밍에 대한 실질적인 경험을 쌓으면서 웹 서버의 내부 동작 원리를 이해하는 도움이 되었다.