tinyhttpd源码剖析(一) :概述
目录:
概述
main() 和 startup()
accept_request() 和 get_line()
execute_cgi()
其他函数
简介
tinyhttpd是个超轻量服务器(还有个简易的Client),总代码500行左右,非常适合我这种菜鸡新手学习,于是乎,有了下面学习小注。因为该程序是基于Sparc Solaris 2.6编写,想要在Linux中运行需要进行一些改动。
tinyhttpd总体思路
tinyhttpd用于处理GET和POST两种http请求方式。主函数包括一个无限循环等待请求模块,通过创建线程处理请求,实现多线程模型。之后对请求进行method提取、URL提取、构建文件路经、无参GET直接输出文件、有参调用执行CGI脚本、读取http请求(如果POST提取状态码)、建立管道实现父子进程通信。
流程图:
函数作用简介
void *accept_request(void *); //处理从套接字上监听到的一个http请求
void bad_request(int); //对错误请求处理
void cat(int, FILE *); //读取服务器上某个文件写到socket套接字
void cannot_execute(int); //处理执行cgi错误
void error_die(const char *); //把错误信息写到perror
void execute_cgi(int, const char *, const char *, const char *); //运行cgi脚本
int get_line(int, char *, int); //读取一行报文
void headers(int, const char *); //http头部写入套接字
void not_found(int); //返回找不到的请求文件
void serve_file(int, const char *); //调用cat把服务器文件内容返回给浏览器
int startup(u_short *); //开启http服务器,包括绑定端口,监听,开启线程处理连接
void unimplemented(int);// 返回给浏览器表明收到的http请求所用方法不被支持
本系列参考博客及书籍:
https://www.cnblogs.com/qiyeboy/p/6296387.html
https://blog.csdn.net/u010487568/article/details/51790935
http://armsword.com/2014/10/29/tinyhttpd-code-analyse/
https://blog.csdn.net/yzhang6_10/article/details/51534409
https://blog.csdn.net/qq_26079093/article/details/90581196
https://blog.csdn.net/jcjc918/article/details/42129311
https://techlog.cn/article/list/10182680
《UNIX网络编程(第3版)》
《Linux/UNIX系统编程手册》