반응형
전체 코드
11.6 - c
=> GET /favicon.ico HTTP/1.1
이 줄에서 HTTP/1.1이 HTTP 버전을 나타낸다. 따라서 나는 HTTP/1.1버전을 사용하는 것을 확인 할 수 있다.
11.7
1. get_filetype에 mp4 타입 추가하기
void get_filetype(char *filename, char *filetype)
{
if (strstr(filename, ".html"))
strcpy(filetype, "text/html");
else if (strstr(filename, ".gif"))
strcpy(filetype, "image/gif");
else if (strstr(filename, ".png"))
strcpy(filetype, "image/png");
else if (strstr(filename, ".jpg"))
strcpy(filetype, "image/jpeg");
else if (strstr(filename, ".mp4")) // 비디오 타입을 처리학 위해 mp4 비디오 타입 추가
strcpy(filetype, "vidoe/mp4");
else
strcpy(filetype, "text/plain");
}
2. MP4 비디오 추가하기
3. home.html에 mp4 실행을 위한 태그 추가하기
<html>
<head><title>test</title></head>
<body>
<img align="middle" src="godzilla.gif">
Dave O'Hallaron
<video src="video.mp4" controls loop autoplay width="550"></video>
</body>
</html>
4. 결과화면
11.9
tiny.c의 serve_static에서 변경하기
1. mmap을 제거하고 malloc으로 변경하기
srcp = (char *) malloc(filesize);
2. rio_readn 사용하기
Rio_writen(fd, srcp, filesize); // 클라이언트에게 파일 내용 전송
3. munmap을 제거하고 free 사용하기
free(srcp); //메모리 할당 해제
11.10
1. adder.c 중 main의 if문 수정
/* 두 개의 인자(숫자)를 추출하는 부분 */
if ((buf = getenv("QUERY_STRING")) != NULL){ // 환경 변수 QUERY_STRING에서 데이터를 가져옴 (웹 브라우저에서 전달된 쿼리 스트링)
p = strchr(buf, '&'); // 쿼리 스트링에서 '&' 문자를 찾아 위치를 p에 저장 (두 숫자를 구분하기 위한 문자)
*p = '\0'; // '&' 문자를 NULL 문자로 바꿔 첫 번째 숫자와 두 번째 숫자를 분리≠
// strcpy(arg1, buf); // 첫 번째 숫자를 arg1에 복사
// strcpy(arg2, p+1); // '&' 이후의 두 번째 숫자를 arg2에 복사
// n1 = atoi(arg1); // 첫 번째 숫자 문자열을 정수로 변환하여 n1에 저장
// n2 = atoi(arg2); // 두 번째 숫자 문자열을 정수로 변환하여 n2에 저장
/* Homework 11.10*/
sscanf(buf, "num1=%d", &n1);
sscanf(p + 1, "num2=%d", &n2);
}
2. home.html에서 n1, n2를 받는 인풋 박스 추가하기
<html>
<head><title>test</title></head>
<body>
<img align="middle" src="godzilla.gif">
Dave O'Hallaron
<video src="video.mp4" controls loop autoplay width="550"></video>
<form action="/cgi-bin/adder" method="GET">
<p>Num 1: <input type="text" name="num1"></p>
<p>Num 2: <input type="text" name="num2"></p>
<input type="submit" value="Calculate">
</form>
</body>
</html>
11.11
1. tiny.c의 doit함수에서 HEAD 메서드에 대한 조건 추가해주기
// tiny는 get요청만 받기 때문에, post요청이 들어오면 애러 메시지를 보내고 main루틴으로 돌아와서 연결을 닫고 다음 연결을 기다린다
/* HTTP 요청의 메서드가 "GET"가 아닌 경우에 501 오류를 클라이언트에게 반환 */
/*Homework 11.11 "HEAD"가 아닌 경우 */
if (strcasecmp(method, "GET") * strcasecmp(method, "HEAD"))
{ // 조건문에서 하나라도 0이면 0
clienterror(fd, method, "501", "Not implemented", "Tiny does not implement this method");
return;
}
2. serve_static함수에서 응답 라인과 헤더를 클라이언트에게 보낼때 HEAD 메서드에 대한 조건 추가하기
/* 응답 라인과 헤더를 클라이언트에게 보냄 */
Rio_writen(fd, buf, strlen(buf));
printf("Response headers: \n");
printf("%s", buf);
if (strcasecmp(method, "HEAD") == 0)
return;
3. adder.c에 *method 메서드 추가하기
char *buf, *p, *method; // 문자열을 저장할 포인터 변수들 (buf: 쿼리 스트링을 저장, p: '&'를 찾은 위치 저장)
11.11 확인하기
1. make && ./tiny (포트번호)로 서버 실행하기
2. 나는 8080포트를 쓰기 때문에 로컬 컴퓨터의 8080 포트로 텍스트 기반 통신하기
'telnet localhost 8080'
이렇게 나오면 지금 'telnet localhost 8080'으로 웹 서버에 성공적으로 연결한거다
3. HTTP GET 요청 보내기
서버에게 리소스의 헤더 정보만 요청하기 위해 'HEAD / HTTP/1.1' 사용하기
4. 요청이 전송되는 호스트 확인하기
'Host: localhost'
반응형
'CS > Computer System' 카테고리의 다른 글
2. PINTOS :: project 1 - Priority Scheduling (1) | 2024.10.01 |
---|---|
1. PINTOS :: project 1 - alarm (0) | 2024.10.01 |
[C언어] tiny 웹 서버 구현하기 (0) | 2024.09.17 |
5. RBTREE Node 삭제 (1) | 2024.09.15 |
4. RBTREE 탐색, array 변환 (2) | 2024.09.15 |