Webサーバ2を自分で書く(getリクエストを処理する)
主な実装機能は,ブラウザのgetリクエスト情報を処理し,ウェブファイルを送信する.処理404、403などのエラー.
1.ネイティブマシンをバインドする1024ポートをReageWebサービスがウェブサービスを提供するポートとして実現する.(マシンにwebサーバが搭載されている場合とポートの競合を避ける)
2.get取得ページ方式を実現する.
3.indexを実現する.htmlはウェブサイトのトップページとして
現在のプログラムはubuntu 12にある.04で正常に動作し、エラーは発生しなかった.
プログラムのダウンロードアドレス:ソースファイル、Webサイトのトップページ、makefileファイルを含む
プログラムコード:
ブログアドレス:http://blog.csdn.net/rentiansheng/article/details/8207381
1.ネイティブマシンをバインドする1024ポートをReageWebサービスがウェブサービスを提供するポートとして実現する.(マシンにwebサーバが搭載されている場合とポートの競合を避ける)
2.get取得ページ方式を実現する.
3.indexを実現する.htmlはウェブサイトのトップページとして
現在のプログラムはubuntu 12にある.04で正常に動作し、エラーは発生しなかった.
プログラムのダウンロードアドレス:ソースファイル、Webサイトのトップページ、makefileファイルを含む
プログラムコード:
/*
* , get , 。 404、403 。
*1. 1024 ReageWeb 。( web )
*2. get 。
*3. index.html
* :Reage
* blog:http://blog.csdn.net/rentiansheng
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>
#define MAX 1024
int res_socket;
void app_exit();
/*
@description:
@parameter
ip:web
port:web
@result: socket , -1
*/
int socket_listen( char *ip, unsigned short int port){
int res_socket; //
int res, on;
struct sockaddr_in address;
struct in_addr in_ip;
res = res_socket = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(res_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET ;
address.sin_port =htons(port);
address.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1");
res = bind( res_socket, (struct sockaddr *) &address, sizeof( address ) );
if(res) { printf( "port is used , not to repeat bind
" ); exit(101); };
res = listen(res_socket,5);
if(res) { printf( "listen port is error ;
" ); exit( 102 ); };
return res_socket ;
}
/*
@description:
@parameter
conn_socket: 。
status:http 。
@s_status:http
@filetype:
*/
void send_http_head(int conn_socket, int status, char *s_status, char *filetype){
char buf[MAX];
memset(buf, 0, MAX);
sprintf(buf, "HTTP/1.0 %d %s\r
", status, s_status);
sprintf(buf, "%sServer: Reage Web Server\r
", buf);
sprintf(buf, "%sContent-Type: %s\r
\r
", buf, filetype);
write(conn_socket, buf, strlen(buf));
}
/*
@description:
@parameter
conn_socket: 。
status:http 。
@s_status:http
@filetype:
@msg:
*/
void send_page_error(int conn_socket, int status, char *s_status, char *msg){
char buf[MAX] ;
sprintf(buf, "<html><head></head><body><h1> %s </h1><hr>Reage Web Server 0.01</body></head>", msg);
send_http_head(conn_socket, status, s_status, "text/html");
write(conn_socket, buf, strlen(buf));
}
/*
@description:
@parameter
conn_socket: 。
@file:
*/
int send_html(int conn_socket, char *file){
int f;
char buf[MAX];
int tmp;
struct stat file_s;
// file , 。
if(0 == strlen(file)){
strcpy(file, "index.html");
}
// , , 404 , 404 。
if(stat(file, &file_s) ){
send_page_error(conn_socket, 404, "Not found", "Not found<br/> Reage does not implement this mothod
");
return 0;
}
// ,
if( !(S_ISREG(file_s.st_mode)) || !(S_IRUSR & file_s.st_mode) ){
send_page_error(conn_socket, 403 , "Forbidden", "Forbidden<br/> Reage couldn't read the file
");
return 0;
}
// , html
send_http_head(conn_socket, 200, "OK", "text/html" );
f = open(file, O_RDONLY);
if(0 > f){
// , 404 , 5xx ,
send_page_error(conn_socket, 404, "Not found", "Not found<br/> Reage couldn't read the file
");
return 0;
}
buf[MAX-1] = 0;// 。
//
while( (tmp= read(f, buf, MAX-1)) && EOF != tmp ){
write(conn_socket, buf, strlen(buf));
}
}
/*
@description: url 。
@parameter:
conn_socket:
uri: url, url, http
@resutl:
*/
int do_uri(int conn_socket, char *uri){
char *p;
p=strchr(uri, '?');
if(p){ *p = 0; p++;}
send_html(conn_socket, uri);
}
void ulog(char *msg){}
void print(char *msg){
ulog(msg);
printf(msg);
}
int main(int argc, char * argv[] ){
int conn_socket;
int tmp ;
int line ;
struct sockaddr_in client_addr;
char buf[MAX];
int len = sizeof(client_addr);
char method[100],uri[MAX],version[100];
char pwd[1024];
res_socket = socket_listen( "127.0.0.1", 1024) ;
// ctrl+c , app_exit
signal(SIGINT, app_exit);
while(1){
conn_socket = accept( res_socket, (struct sockaddr * )&client_addr, &len );
printf("reage
");
line = 0;
//
while(0 == (tmp = read( conn_socket, buf, MAX-1) ) || tmp != EOF ){
buf[MAX-1]=0;
break;// ,
}
//send_http_head(conn_socket, 200, "text/html");
sscanf(buf, "%s %s %s", method, uri, version);
// get
if(!strcasecmp(method, "get"))
//send_html(conn_socket, "h.html");
do_uri(conn_socket, uri+1);
close(conn_socket);
}
}
void app_exit(){
// ctrl+c
signal (SIGINT, SIG_DFL);
// 、 ip
close(res_socket);
printf("
");
exit(0);
}
ブログアドレス:http://blog.csdn.net/rentiansheng/article/details/8207381