httpd工作原理

简单说下程序的逻辑吧:

一个无限循环,一个请求,创建一个线程,之后线程处理函数处理每个请求,然后解析HTTP请求,然后做一些判断处理,之后判断文件是否可执行,不可执行则打开文件,输出给客户端(浏览器)呗,可执行就创建管道,父子进程通信。

整个流程就这么简单,程序主要处理2种HTTP请求方式:GET和POST。

main函数中:
首先调用startup函数:在服务端设置socket,绑定端口号,然后建立监听socket

while循环:进入循环,服务器通过调用accept等待客户端的连接,accept会以阻塞的方式运行,直到有客户端连接才会返回。连接成功后,服务器调用pthread_create启动一个新的线程(accept_request)来处理客户端的请求,处理完成后,重新(accept)等待新的客户端请求。

处理请求(accept_request)的流程:

1 从客户端读取请求行(GET /index.html HTTP/1.1)

2 判断请求方法,如果不是GET或者POST,返回服务端无法实现错误501

3 读取buf中请求行中的url

4 对于GET请求,得到请求文件路径,请求文件存放在httpdocs文件夹下,主要是test.html和post.html,判断请求文件是否有效,如果有效,根据cgi的值,进行静态解析或者cgi动态展示

5 如果GET请求的是test.html,直接读取文件返回给请求的http客户端,调用serve_file函数。流程:先把请求头剩余内容读出(get_line)并忽略,然后调用headers函数向客户端发送请求成功响应头,调用cat向客户端发送test.html文件。

6 如果GET请求的是post.html文件,调用execute_cgi函数,创建子进程,父进程读取post.html界面,通过POST请求发送给服务端的注册信息,输出给子进程,子进程运行cgi脚本,并将结果写给父进程,父进程发送给客户端。

7 关闭与客户端的连接

注意:
从socket中读取文件统一用send,recv
管道间通信用read,write。
区别:
https://blog.csdn.net/petershina/article/details/7946615

tiny httpd 的框架:
在这里插入图片描述

参考:https://www.jianshu.com/p/18cfd6019296
https://www.cnblogs.com/qiyeboy/p/6296387.html
http://armsword.com/2014/10/29/tinyhttpd-code-analyse/
https://blog.csdn.net/yzhang6_10/article/details/51534409#commentBox
https://blog.csdn.net/jcjc918/article/details/42129311#commentBox

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

触不可及<>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值