客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)请求头部(header)空行请求数据四个部分组成,下图给出了请求报文的一般格式。

实例

GET / HTTP/1.1\r\n
Host: 127.0.0.1:10000\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
……
buff=Accept-Language: zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7,en-US;q=0.6\r\n
\r\n

HTTP 响应头信息

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

状态码

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

判断请求的资源是否存在

stat函数

作用:获取文件的状态信息,其中st_mode可以用来判断文件类型

pipe与CGI

pipe

int fields[2];
int pipe(fields);
fields[0] 读端
fileds[1] 写端

dup2

int dup2(int file_id1, int file_id2);

复制文件描述符file_id1到file_id2,file_id2如果存在则关闭file_id2

作用:使得file_id1和file_id2有共享的文件偏移量和文件状态,pipe和dup2两者配合,可以实现进程的通信。

GGI

CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求RequestHeader头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文。

工作概要:对于一个CGI程序,主要的工作是从环境变量和标准输入中读取数据,然后处理数据,最后向标准输出中输出数据。

execl

作用:原先fork()创建出来的进程是与原先的父进程共享代码段,使用execl后,可以将子进程替换成一个指定的程序。

int execl(const char *path, const char *arg, ...)

第一参数path字符指针所指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]… 最后一个参数须用空指针NULL作结束。

通常第一个参数为程序名