11.7) Tiny를 확장해서 MPG 비디오 파일을 처리하도록 하시오. 실제 브라우저를 사용해 여러분의 결과를 체크하시오(MPG 대신 mp4)
1.get_filetype에 mp4 추가하기
//MIME type을 읽고 값을 *filetype에 저장
void get_filetype(char *filename, char *filetype)
{
if (strstr(filename, ".html")) // 파일 확장자가 .html이면
strcpy(filetype, "text/html"); // MIME 타입을 text/html로 설정
else if (strstr(filename, ".gif")) // .gif 파일이면
strcpy(filetype, "image/gif"); // MIME 타입을 image/gif로 설정
else if (strstr(filename, ".png")) // .png 파일이면
strcpy(filetype, "image/png"); // MIME 타입을 image/png로 설정
else if (strstr(filename, ".jpg")) // .jpg 파일이면
strcpy(filetype, "image/jpeg"); // MIME 타입을 image/jpeg로 설정
else if (strstr(filename, ".mp4")) // .mp4 파일이면
strcpy(filetype, "video/mp4"); // MIME 타입을 video/mp4로 설정
else
strcpy(filetype, "text/plain"); // 알 수 없는 확장자일 경우 기본 MIME 타입인 text/plain을 설정
}
2. tiny.c 파일 동일 위치에 mp4 비디오 추가
3. home.html에 mp4 실행을 위한 태그 추가
<html>
<head><title>test</title></head>
<body>
<img align="middle" src="godzilla.gif">
Dave O'Hallaron
<video width="640" height="480" controls>
<source src="video.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</body>
</html>
4. 결과
(참고) 더 deep 하게 가보려면
https://jinsang-2.tistory.com/88
11.9) TINY를 수정해서 정적 컨텐츠 처리할 때 요청한 파일을 mmap과 rio_readn 대신에 malloc, rio_readn, rio_writen을 사용해서 연결 식별자에게 복사하도록 하시오.
이전부분 주석처리
void serve_static(int fd, char *filename, int filesize, char *method)
{
...
// 클라이언트에 응답 본문 전송
srcfd = Open(filename, O_RDONLY, 0); // 파일을 읽기 전용으로 열어 파일 디스크립터를 얻음
// srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0); // 파일을 메모리에 매핑
srcp = (char *)malloc(filesize) ; // malloc 사용, 데이터 할당
Rio_readn(srcfd,srcp,filesize); // srcfd에서 filesize 바이트만큼의 데이터를 srcp에 읽어옴
Close(srcfd); // 파일 디스크립터를 닫음 (파일을 더 이상 사용할 필요 없음)
Rio_writen(fd, srcp, filesize); // 메모리에 매핑된 파일 내용을 클라이언트에 전송
// Munmap(srcp, filesize); // 파일의 메모리 매핑을 해제
free(srcp);
}
11.10) 두 개의 숫자 html에서 입력받고 더해서 display
home.html에 form, input 태그 사용
http://{서버 주소}/cgi-bin/adder?A=123&B=456
input 태그에 name 속성을 사용해야 위에처럼 uri이 서버에 넘어간다.
<form action="/cgi-bin/adder" method="GET">
<p>a: <input name="A" /></p>
<p>b: <input name="B" /></p>
<input type="submit">
</form>
adder.c 수정
char *buf, *p, *A,*B; // A,B 추가해주기
...
A = strchr(buf, 'A');
B = strchr(buf, 'B');
p = strchr(buf, '&');
*p = '\0';
strcpy(arg1, A+2);
strcpy(arg2, B+2);
n1 = atoi(arg1);
n2 = atoi(arg2);
- 해당 buf에는 A=123&B=456 값이 담겨져 있음
- '&' null 로 만들고 'A'위치 찾고 'B'위치 찾고 strcpy 때리믄 됨
11.11 Tiny 확장 , HTTP HEAD 메소드 지원하게 구현
doit 함수 수정
// 메서드가 "GET", "HEAD"가 아닌 경우 에러 처리
if (strcasecmp(method, "GET") && strcasecmp(method, "HEAD")) {
clienterror(fd, method, "501", "Not Implemented", "Tiny does not implement this method"); // 지원되지 않는 메서드에 대한 에러 메시지 전송
return;
}
- strcasecmp는 해당 인자가 있으면 0을 반환함
serve_static에 인자에 method 추가
void serve_static(int fd, char *filename, int filesize, char *method)
{
...
// 메소드 헤드 처리
if (strcasecmp(method, "HEAD") == 0)
return;
}
- 이후 헤드 메소드 처리
서버 실행 후 새로운 다른 터미널에 밑에 명령어를 치자
telnet localhost 80
입력 후
HEAD / HTTP/1.1
입력 후 엔터
'SW 사관학교 정글(Jungle) > 컴퓨터 시스템(CSAPP)' 카테고리의 다른 글
[CSAPP] 11.4 소켓 인터페이스 (1) | 2024.09.16 |
---|---|
[CSAPP] 11.3 글로벌 IP 인터넷 (0) | 2024.09.16 |
[CSAPP] 11.2 네트워크 (1) | 2024.09.16 |
[CSAPP] 11-1 클라이언트-서버 프로그래밍 모델 (0) | 2024.09.16 |
[CSAPP] 9-9 동적 메모리 할당(Dynamic Memory Allocation) (0) | 2024.09.05 |