HTTP 프로 토 콜 소개 및 웹 서버 구축 경험
16580 단어 Linux 네트워크 프로 그래 밍
1. HTTP 개념
HTTP (하이퍼텍스트 전송 프로 토 콜, HyperText Transfer Protocal).인터넷 응용 이 가장 광범 위 한 네트워크 응용 층 프로 토 콜 은 네트워크 전송 을 줄 이 고 브 라 우 저 를 더욱 효율적으로 할 수 있다.일반적으로 HTTP 정 보 는 클 라 이언 트 가 서버 에 요청 한 메시지 와 서버 가 클 라 이언 트 에 대한 응답 메 시 지 를 포함한다.
2. 요청 메시지
방향: 브 라 우 저 → 서버, 주요 내용 은 네 부분 을 포함 합 니 다.
(첫 번 째 줄 은 요청 행, 2 - 8 행위 요청 헤드, 9 줄 은 빈 줄 표지 요청 헤드 의 끝)
2.1 청구 방법
3. 응답 메시지
방향: 서버 → 브 라 우 저, 주요 내용 은 네 부분 을 포함 합 니 다.
(각 줄 의 끝 은 \ r 를 사용 하고 9 줄 의 빈 줄 도 프로 토 콜 헤더 의 일부분 입 니 다)
3.1 상태 코드
상태 코드 는 세 자리 숫자 로 표시 되 고 첫 번 째 숫자 는 응답 하 는 유형 을 정의 하 며 모두 다섯 가지 유형 으로 나 뉜 다.
상태 코드
속뜻
200 OK
클 라 이언 트 요청 성공
400 Bad Request
클 라 이언 트 요청 에 문법 오류 가 있어 서버 에서 이해 할 수 없습니다.
401 Unauthorized
요청 이 인증 되 지 않 음
403 Forbidden
서버 에서 요청 을 받 았 으 나 서비스 제공 을 거부 하 였 습 니 다.
404 Not Found
요청 한 자원 이 존재 하지 않 습 니 다. 예 를 들 어 잘못된 URL 을 입력 했 습 니 다.
500 Internal Server Error
서버 에 예측 할 수 없 는 오류 가 발생 했 습 니 다.
503 Server Unavailable
서버 는 현재 클 라 이언 트 의 요청 을 처리 할 수 없습니다.
3.2 네트워크 파일 형식
파일 형식
HTTP 문법
일반 파일
text/plain;charset=ios-8859-1
*.html
text/html;charset=ios-8859-1
*.jpg
image/jpeq
*.gif
image/gif
*.png
image/png
*.wav
audio/wav
*.avi
video/x-msvidio
*.mov
video/quicktime
*.mp3
audio/mpeg
3.3 인 코딩 형식
부호화 형식
묘사 하 다.
charset = iso-8859-1
서구 의 인 코딩 은 사이트 가 영문 인 코딩 을 채택 한 다 는 것 을 설명 한다.
charset = gb2312
사이트 에서 사용 하 는 인 코딩 은 간 체 중국어 임 을 설명 한다.
charset = utf-8
세계 적 으로 통용 되 는 언어 인 코딩 으로 중국어, 일본어 등 세계 적 으로 통용 되 는 언어 를 사용 할 수 있다.
charset = euc-kr
사이트
charset = big5
사이트 에서 사용 하 는 인 코딩 은 번 체 중국어 임 을 설명 한다.
4. HTTP 전송 프로 세 스
5. 웹 서버 구축 경험 치
5.1 정규 표현 식 파일 이름 가 져 오기
// 、 , sscanf
char method[16], path[256], protocol[16];
sscanf(buf, "%[^ ] %[^ ] %[^ ]", method, path, protocol);
5.2 파일 존재 여부 판단
//stat ( ll )
int ret = stat(file, &sbuf);
if(ret != 0)
{
// , 404 , URL
perror("stat judge err!");
}
if(S_ISREG(sbuf.st_mode))
{
//
printf("Request regular file!
");
// , ,respond 、
http_respond(cfd, 200, "OK", "Content-Type:audio/mpeg",sbuf.st_size);
//
send_file(cfd, file);
}
5.3 자원 은 일시 적 으로 오류 해결 을 사용 할 수 없습니다.
// io EAGAIN EINTR ,
while((n = read(fd, buf, sizeof(buf))) > 0)
{
ret = send(cfd, buf, n, 0);
if(ret == -1)
{
// ,
printf("errno = %d
", errno);
if(errno == EAGAIN)
{
printf("errno:EAGAIN!
");
continue;
}
else if(errno == EINTR)
{
printf("errno:EINTR!
");
continue;
}
else
{
perror("send to client err!");
exit(1);
}
}
}
5.4 브 라 우 저 요청 ico
5.5 디 렉 터 리 검색 함수
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
// ,
int alphasort(const struct dirent **a, const struct dirent **b);
int versionsort(const struct dirent **a, const struct dirent **b);
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all filesystem types */
char d_name[256]; /* filename */
};
filter: 필터, 일반적인 상황 에서 NULL compar: 일반적인 상황 에서 하위 alphasort 5.6 한자 의 코딩
5.7 telnet 디 버 깅
telnet 127.0.0.1 9876 //
GET /hello.c http/1.1 // ,