简介
Tinyhttp是一个轻量型Http Server,使用C语言开发,全部代码只500多行,还包括一个简单Client。
Tinyhttp程序的逻辑为:一个无线循环,一个请求,创建一个线程,之后线程函数处理每个请求,然后解析HTTP请求,做一些判断,之后判断文件是否可执行,不可执行,打开文件,输出给客户端(浏览器),可执行就创建管道,父子进程进行通信。父子进程通信,用到了dup2和execl函数。
模型图
源码剖析
1 #include <stdio.h> 2 #include <sys/socket.h> 3 #include <sys/types.h> 4 #include <netinet/in.h> 5 #include <arpa/inet.h> 6 #include <unistd.h> 7 #include <ctype.h> 8 #include <strings.h> 9 #include <string.h> 10 #include <sys/stat.h> 11 #include <pthread.h> 12 #include <sys/wait.h> 13 #include <stdlib.h> 14 15 #define ISspace(x) isspace((int)(x)) 16 17 #define SERVER_STRING "Server: jdbhttpd/0.1.0 " 18 19 void *accept_request(void *); 20 void bad_request(int); 21 void cat(int, FILE *); 22 void cannot_execute(int); 23 void error_die(const char *); 24 void execute_cgi(int, const char *, const char *, const char *); 25 int get_line(int, char *, int); 26 void headers(int, const char *); 27 void not_found(int); 28 void serve_file(int, const char *); 29 int startup(u_short *); 30 void unimplemented(int); 31 32 /**********************************************************************/ 33 /*功能:处理请求 34 *参数:连接到客户端的套接字*/ 35 /**********************************************************************/ 36 void *accept_request(void *arg) 37 { 38 int client = *(int *)arg; //接收客户端的套接字 39 char buf[1024]; 40 int numchars; 41 char method[255]; 42 char url[255]; 43 char path[512]; 44 size_t i, j; 45 struct stat st; 46 int cgi = 0; 47 48 char *query_string = NULL; 49 // "GET /index.html HTTP/1.1 ",' 00' <repeats 319 times>... 50 numchars = get_line(client, buf, sizeof(buf)); //读取一行存放buf中 51 i = 0; 52 j = 0; 53 //判断buf中第一个空格前面的字符串的请求方式 54 while (!ISspace(buf[j]) && (i < sizeof(method) - 1)) 55 { 56 method[i] = buf[j]; //解析出请求的方法放在method中 57 i++; 58 j++; 59 } 60 method[i] = '