Webサーバ2を自分で書く(getリクエストを処理する)

5503 ワード

主な実装機能は,ブラウザのgetリクエスト情報を処理し,ウェブファイルを送信する.処理404、403などのエラー.
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