Webサーバプログラム


この文章はLinuxシステムに基づいて、紹介したWebサーバーの簡単なプログラミングと使用です.
一、webサーバの概要
ブラウザ(クライアント)が実行されると、webserverサーバは次のフォーマットのメッセージ要求を受信します.
            GET/index.html HTTP/1.1
            Accept: text/html, application/xhtml+xml, */*
            Accept-Language: zh-CN
            User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
            Accept-Encoding: gzip, deflate
            Host: 192.168.139.128:8000
            Connection: Keep-Alive
このメッセージは、ブラウザ(クライアント)がwebserverに/html/index.htmlという名前のWebファイルを送信することを望んでいることを示しています.webserverサーバはメッセージを抽出します.
のWebファイルのパス/html/index.html、webserverで指定するディレクトリの下で抽出したパス/html/indexを押します.htmlページファイルを開く
ファイルのデータを読み込み、ウェブサーバでWebファイルのデータを転送する前にブラウザ(クライアント)に「要求成功」メッセージを送信します.
Webserverサーバがブラウザ(クライアント)に必要なWebファイルを見つけたことを示します.その後、転送が完了するまでWebファイルデータを転送し続けます.Webページの場合
ファイルが失敗すると、webserverサーバはブラウザ(クライアント)に「リクエスト失敗」メッセージを送信し、accpetが返すソケットを閉じます.
要求成功メッセージフォーマット:
            char head[]="HTTP/1.1 200 OK\r"        \
                                "Content-Type: text/html\r"\
                                "\r"; 
要求失敗メッセージ形式:
            char err[]= "HTTP/1.1 404 Not Found\r"  \
                             "Content-Type: text/html\r"     \
                             "\r"                                           \
                             "File not found";
二、ホームページindex.htmlプログラム
ホームディレクトリの下にhtmlフォルダを作成する:mkdir html
htmlファイルにindexを追加します.htmlファイル:vi index.html
<html>
	<head>
		<title>html</title>
		<meta http-equiv="content-type" content="text/html; charset=gb2312" />
		<meta http-equiv="refresh" content="5;url=http://blog.csdn.net/hanbo622/">
		<meta name="keywords" content="jump">
	</head>
	<body>
		5    <     >    !
	</body>
</html>

三、webserverプログラム
ホームディレクトリの下にwebserverを作成します.cファイル:vi webserver.c    
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>

/************************************************************************
    :	      webserver
    :	arg       
    :	 
************************************************************************/
void * client_process(void *arg)
{
	int connfd = (int)arg; 
	int fd = 0;
	int len = 0;
	char recv_buf[1024] = "";
	char file_buf[1024] = "";
	char filename[50] = "html/";
	
	char head[] = "HTTP/1.1 200 OK\r
" \ "Content-Type: text/html\r
" \ "\r
"; char err[]= "HTTP/1.1 404 Not Found\r
" \ "Content-Type: text/html\r
" \ "\r
" \ "<HTML><BODY>File not found</BODY></HTML>"; recv(connfd, recv_buf, sizeof(recv_buf), 0); // sscanf(recv_buf, "GET /%[^ ]", (filename + 5)); // if(filename[5] == 0) // , { strcpy(filename, "html/index.html"); } fd = open(filename, O_RDONLY); if(fd < 0) { perror("open"); send(connfd, err, strlen(err), 0); // close(connfd); return NULL; } send(connfd, head, strlen(head), 0); // while((len = read(fd, file_buf, sizeof(file_buf))) > 0) // { send(connfd, file_buf, len, 0); } close(fd); close(connfd); return NULL; } int main(int argc, char *argv[]) { unsigned short port = 8000; int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket"); exit(-1); } struct sockaddr_in my_addr; bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)); if(err_log != 0) { perror("bind"); close(sockfd); exit(-1); } err_log = listen(sockfd, 10); if(err_log != 0) { perror("listen"); close(sockfd); exit(-1); } while(1) { char cli_ip[INET_ADDRSTRLEN] = ""; struct sockaddr_in client_addr; socklen_t cliaddr_len = sizeof(client_addr); int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if(connfd < 0) { perror("accept"); continue; } else { pthread_t tid; inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN); printf("connected form:IP=%s, PORT=%d
\r", cli_ip,ntohs(client_addr.sin_port)); /* */ pthread_create(&tid, NULL, client_process, (void *)connfd); /* , , */ pthread_detach(tid); } } close(sockfd); // return 0; }

注:最後にコンパイルして生成した実行可能ファイルはhtmlフォルダと同じディレクトリで実行する必要があります.
四、ブラウザを使ってアクセスする
ブラウザのアドレスバーに次のように入力します.http://192.168.139.128:8000(このIPはwebserverシステムを実行するIPであり、ポート番号はwebserverプログラムが設定したポート番号である)