没有合适的资源?快使用搜索试试~ 我知道了~
首页Http Server简要设计说明及源代码
1、本程序实现简易httpServer,支持简单的文件请求以及cgi调用。 2、提供200(OK),403(Forbidden),404(Not Found),501(Not Implemented)几种类型消息 响应。 3、支持多用户并发访问。 4、关于php解释器: 支持的功能: 1)、允许php脚本与html脚本嵌套 2)、支持简单的echo,if,elseif,else,for,while以及相互之间的嵌套 3)、支持后缀自增运算符($i++),赋值操作,包括字符串拼接,数值运算,数与字符串拼接 不支持的功能: 1)、不支持echo后面跟多行作为输出 2)、暂时不支持语句内的注释 3)、与运算有关的暂时只支持+,-操作,不支持%,*,/;不支持类似$i+=2的操作 4)、暂时不支持数组操作 要求与限制: 1)、必须有<?php作为开头和?>作为结尾 2)、放在if,else,for,while中的语句无论有多少条都必须用花括号括起来 3)、暂时假定php文件的内容可以一次全部读入缓冲区
资源详情
资源推荐
Linux 下 Http Server 设计说明
一、功能说明
1、本程序实现简易 httpServer,支持简单的文件请求以及 cgi 调用。
2、提供 200(OK),403(Forbidden),404(Not Found),501(Not Implemented)几种类型消
息
响应。
3、支持多用户并发访问。
4、关于 php 解释器:
支持的功能:
1)、允许 php 脚本与 html 脚本嵌套
2)、支持简单的 echo,if,elseif,else,for,while 以及相互之间的嵌套
3)、支持后缀自增运算符 ($i++),赋值操作,包括字符串拼接,数值运算,数与字符
串拼接
不支持的功能:
1)、不支持 echo 后面跟多行作为输出
2)、暂时不支持语句内的注释
3)、与运算有关的暂时只支持 +,-操作,不支持%,*,/;不支持类似$i+=2 的操作
4)、暂时不支持数组操作
要求与限制:
1)、必须有 <?php 作为开头和?>作为结尾
2)、放在 if,else,for,while 中的语句无论有多少条都必须用花括号括起来
3)、暂时假定 php 文件的内容可以一次全部读入缓冲区
二、相关知识
http 协议分为请求消息和响应消息,请求消息由三部分构成,请求行、消息报头、请
求正文。
请求行格式为:Method Request-URI HTTP-Version CRLF
消息报头由一系列的 key-value 对组成,每行一个,格式为 key+”:”+空格+value,消息
报头与消息正文间有一单独空行。
响应消息类似,其中有一个状态码表示服务器处理的结果,常见有 200(OK)表示请求
已 被 成 功 接 收 、 理 解 、 接 受 ;403(Forbidden) 表 示 由 于 权 限 问 题 等 服 务 器 拒 绝 提 供 服
务;404(Not Found)表示请求的资源不存在等;501(Not Implemented)则表示服务器端未实现相
应的功能。
三、设计步骤
1、创建一个服务器,并监听既定的端口等待客户端的连接。
2、客户端发出连接请求后即创建一个子进程处理用户请求。
3、读取客户端发送的请求信息并获取相应的环境变量。
4、判断请求的文件是普通文件、cgi 程序还是 php 脚本文件,如果是普通文件则直接
将文件内容 write 给客户端,如果是 cgi 程序创建一个新进程执行 cgi 程序,否则转 5。
5、识别出是 php 脚本文件后,调用 phpPraser 函数在相应的目录下将文件内容读入缓
冲区(假设一次可以全部读取),然后以空格、换行符等为分界符获取单个的字符串,并判
断如果是<?php 则获取后续内容直至遇到?>,将获取的内容作为参数传递到 php 解释器
doPraser。其中部分主要函数的功能解释如下:
commPraser:负责以指定的分界符解析出变量,关键字,字符串常量,数值,并根据字符
串的类型调用相应的解析函数。
doEcho:如果解析出的字符串时 echo,则说明后面是要输出的内容,调用 doEcho 解析之。
do_if,do_while,do_for 同理
conditionPraser:如果字符串是关键字 if,while,for,则说明后面是条件表达式,调用
conditionPraser 解析条件表达式并执行相应的操作
do_assign:如果解析出的内容是要对某变量赋值,则调用 do_assign 函数
四、源代码
/*
* 本程序实现简易 httpServer,支持简单的文件请求、cgi 调用以及 php 解释器
* 提供
* 200(OK),
* 403(Forbidden),
* 404(Not Found),
* 501(Not Implemented)几种类型消息响应
* */
#define _REENTRANT
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <signal.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define SIZE 512
#define SSIZE 64
#define VARIABLE 1
#define CONSTANT 2
#define KEY_WORD 3
#define KEY_WORD_NUM 11
#define ERROR -1
int port;
char *rootDoc;
char keywords[]
[SSIZE]={"echo","for","while","if","elseif","else","break","continue","return","switch","case","de
fault"};
//map<string,string> mapStr; //定义一个存放 php 变量名及对应 value 的 map 数组,错误!这个
变量还不能定义成全局变量,要考虑到多用户的情况
int getInfo(const char *dest,const char *src,char *result);
inline int isSubStr(const char *dest,const char *src,int &left,int &right);
inline void getSubStr(char *buffer,int i,char *dest);
void getEnv(char *buffer);
void process(char *buffer,int client_fd);
inline void clear_line_break(char *buffer,int &i,int len);
inline int isKeyWord(char *tmp);
inline bool isDigital(char *str);
int commPraser(char *str,int len,int &i,char*tmp);
inline int getVar(char *src,char *dest,map<string,string> &mapStr); //mapStr 必 须 作 为 引
用传递,否则所做的改变无效
int conditionPraser(char *str,int len,int i,map<string,string> &mapStr);
inline void doEcho(FILE *tmpfp,char *str,int len,int &i,map<string,string> &mapStr);
inline void getCrossBody(char *str,int len,int &i,char *mainBody);
void insertVar(char *key,char *var,map<string,string> &mapStr);
void do_while(FILE *tmpfp,char *str,int len,int &i,map<string,string> &mapStr);
void do_for(FILE *tmpfp,char *str,int len,int &i,map<string,string> &mapStr);
void do_if(FILE *tmpfp,char *str,char *tmp,int len,int &i,map<string,string> &mapStr);
void do_assign(char *key,char *str,map<string,string> &mapStr);
void doPraser(FILE *tmpfp,char *str,int len,int i,map<string,string> &mapStr);
void phpPraser(int client_fd,FILE *fp,char *buffer);
void transfer(int client_fd,char *path);
void log(const char *inf,int line,int tag=0);
/*
* 功能:查询 src 中是否有 key 值 dest,如果有则取出对应的 value 存放到 result 中
* 返回值:返回 0 表示成功查找到相应 key,-1 表示查找失败
* */
int getInfo(const char *dest,const char *src,char *result)
{
int left,right,j;
if(isSubStr(dest,src,left,right) == 0)
{
for(j=left;j<right;j++)
result[j-left]=src[j];
result[j-left]=0;
return 0;
}
return -1;
}
/*
* 功能:判断 dest 中所存放的 key 是否是 src 的子串,是则将对应的 value 起止下标存入 left
和 right 中
* 返回值:0 成功,-1 失败
* */
inline int isSubStr(const char *dest,const char *src,int &left,int &right)
{
char tmp[SIZE];
int lens=strlen(src);
int lend=strlen(dest);
int i,j,k;
for(i=0;i<lens-lend;i++)
{
for(j=i;j<i+lend;j++)
tmp[j-i]=src[j];
tmp[j-i]=0;
if(strcasecmp(dest,tmp) == 0)
{
left=i+lend+2; //2 表示一个冒号和一个空格
right=left;
while(src[right] != '\n')
right++;
return 0; //成功获取环境变量
}
}
return -1;
}
/*
* 功能:获取 http 请求行中的 REQUEST_METHOD 等信息
* */
inline void getSubStr(char *buffer,int i,char *dest)
{
int j=0;
while(buffer[i] != ' ')
{
dest[j++]=buffer[i];
i++;
}
dest[j]=0;
}
/*
* 从客户端的请求信息中获取环境变量等信息
* */
void getEnv(char *buffer)
{
int left,right;
char tmp[SIZE];
const char *cLen="content-length";
const char *cType="content-type";
int i=0;
while(buffer[i] != ' ')
{
tmp[i]=buffer[i];
i++;
}
tmp[i]=0;
setenv("REQUEST_METHOD",tmp,1);
getInfo(cLen,buffer,tmp);
setenv("CONTENT_LENGTH",tmp,1);
getInfo(cType,buffer,tmp);
setenv("CONTENT_TYPE",tmp,1);
}
/*
* 处理客户请求,包括请求普通文件以及调用 cgi
* */
void process(char *buffer,int client_fd)
{
char *env=getenv("REQUEST_METHOD");
char tmp[SIZE];
char requestDoc[SIZE];
char queryStr[SIZE];
if(env == NULL ||
strcasecmp(env,"POST") != 0 &&
strcasecmp(env,"GET") != 0 &&
strcasecmp(env,"HEAD") != 0) //目前只检测三种方式
剩余24页未读,继续阅读
捣弹不对
- 粉丝: 2
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功