[作业向]tinyhttp web服务器设计及完整代码

  最近看了《HTTP权威指南》和《UNP》有了写一个简单的web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错误的,希望各位指出哈。

tinyhttp web服务器的架构为epoll + 多线程 + sendfile, 本来想用线程池代替的因为每来一个连接就new一个线程这样对于OS来说负担太大,并且线程一旦过多线程切换就会花费很大代价造成性能瓶颈,但是我打算之后单独写一个线程池代码示例的说,所以这个版本就使用多线程来代替线程池了。

tinyhttp暂时只支持GET和HEAD方法,支持的首部不多大概七八个吧,支持伪长连接(我觉得是伪的哈哈)。

话不多说,先上几张效果图吧:

这张是测试http请求和响应包的

这张是自己构造了一个包来收发的

这张是我把google首页的源代码拿来测试的

这张是我自己写了一个html代码使用火狐浏览器来与的我tinyhttp web服务其通信的测试

我的tinyhttp是可配置的,现阶段只支持domain和docroot配置项,domain就是你部署的网站域名,docroot想必学过网页的都知道是什么意思吧~

好了,,现在就把完整的源代码给出,总共有1500+行:

*AuthorZou Xiao hang 3 *Email1210603696@qq.com 4 *File Name tinyhttp.h 5 *Date2013/10/05#ifndef _TINY_HTTP_H_ 8 #define _TINY_HTTP_H_ 9 10 #include <sys/socket.h> 11 #include <sys/types.h> 12 #include <stdlib.h> 13 #include <stdio.h> 14 #include <netdb.h> 15 #include <sys/epoll.h> 16 #include <strings.h> 17 #include <string> 18 #include <errno.h> 19 #include <unistd.h> 20 #include <fcntl.h> 21 #include <utility> 22 #include <fstream> 23 #include <sstream> 24 #include <map> 25 #include <iostream> 26 #include <string.h> 27 #include <pthread.h> 28 #include <netinet/tcp.h> 29 #include <time.h> 30 #include <sys/stat.h> 31 #include <sys/sendfile.h>#include std; 37 38 typedef struct _epollfd_connfd 39 { 40int epollfd; 41int connfd; 42 }_epollfd_connfd;********************************** 常数定义 MAX_EVENTS 1024 MAX_BACKLOG 100*************************************************************************************************************** 保存配置文件相关值 tyhp_domain(“”); 54 string tyhp_docroot(“”); 55 /**************************************************************************************************************** MIME定义 typedef struct mime_node 61 {*type;*value; 64 }mime_node; 65 66 mime_node tyhp_mime[] = 67 {, },, },, },, },, },, },, },, },, },, },, },, },, },, },, },, },, }, 85 {NULL ,NULL} 86 }; *函数作用:将MIME的type转换为相应的value 89 *函数参数:type 90 *函数返回值: NULL表示type在MIME中不存在,否则返回相应value的指针inline *type) 93 { 94for(int i = 0; tyhp_mime[i].type != NULL; ++i) 95 { 96if(strcmp(type, tyhp_mime[i].type) == 0) 97return tyhp_mime[i].value; 98 } 99return NULL;100 }101 /**************************************************************************************************************** HTTP状态码 TYHP_CONTINUE100 TYHP_OK200 TYHP_ACCEPTED202 TYHP_MOVED301 TYHP_FOUND302 TYHP_SEEOTHER303 Location URLTYHP_BADREQUEST400 TYHP_FORBIDDEN403 TYHP_NOTFOUND404 TYHP_ERROR500 TYHP_NOIMPLEMENTED 501 TYHP_BADGATEWAY502TYHP_SRVUNAVAILABLE 503 tyhp_ok[] =;;;;; *函数作用:通过HTTP状态码返回友好语句137 *函数参数:HTTP状态码138 *函数返回值: 相应的语句*tyhp_get_state_by_codes(int http_codes);141 /**************************************************************************************************************** HTTP响应首部 TYHP_ACCEPTRANGE_HEAD”Accpet-Range”147 #define TYHP_AGE_HEAD”Age”148 #define TYHP_ALLOW_HEAD”Allow”149 #define TYHP_CONTENTBASE_HEAD”Content-Base”150 #define TYHP_CONTENTLENGTH_HEAD”Content-Length”151 #define TYHP_CONTENTLOCATION_HEAD”Content-Location”152 #define TYHP_CONTENTRANGE_HEAD”Content-Range”153 #define TYHP_CONTENTTYPE_HEAD”Content-Type”154 #define TYHP_DATE_HEAD”Date”155 #define TYHP_EXPIRES_HEAD”Expires”156 #define TYHP_LAST_MODIFIED_HEAD”Last-Modified”157 #define TYHP_LOCATION_HEAD”Location”158 #define TYHP_PUBLIC_HEAD”Public”159 #define TYHP_RANGE_HEAD”Range”160 #define TYHP_SERVER_HEAD”Server”161 /**************************************************************************************************************** HTTP请求首部 *****************************************************************************心中有愿望一定要去闯,努力实现最初的梦想,

[作业向]tinyhttp web服务器设计及完整代码

相关文章:

你感兴趣的文章:

标签云: