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