基于自主web服务器的在线计算和huffman编码解码

1、项目背景

 基于http协议的服务已经被广泛应用,做这个项目不仅可以复习所学的网络编程的知识,也可以加深对http协议的理解。

2、项目目标

 浏览器请求网页时服务器返回自己制作的网页,网页不存在返回404页面。可以实现在线的加减乘除运算和huffman的编码解码。

3、项目分析

  1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源
  2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面)
  3、服务器能进行简单的cgi运行。比如当客户在表单中输入数据后,服务器能够将运行结果返回个客户
  4、huffman编码解码

3.1 环境

(1) CentOS 7
(2) vim/g++
(3) C++

3.2 项目涉及知识点

(1) 网络编程(基于TCP协议、http协议)
  (2) 多线程技术
  (3) cgi技术
  (4) 进程间通信
  (5) 文件描述符重定向

3.3 项目框架

在这里插入图片描述

3.4 模块设计

(1)日志模块 Log.hpp
(2) 服务器封装模块:HttpServer.hpp
(3) 工具模块:Util.hpp
(4)套接字封装模块:Sock.hpp
(5) 线程池封装模块:ThreadPool.hpp
(6) http请求、响应模块:Protocol.hpp
(7) 系统驱动模块:main.cc
(8)网页内容模块:wwwroot

4、 项目运行流程

1、运行服务器程序,创建监听套接字,套接字绑定端口,将套接字设置为监听状态,忽略SIGPIPE信号,创建线程池对象,线程池初始化(创建线程并且分离,然后挂起),accept函数等待连接。
  2、客户端(浏览器)访问服务器,三次握手成功后,accept返回接受套接字,生成一个任务,放到任务队列等待处理。
  3、处理任务:从请求报文中把报文首行、报文头分别取出来,然后对报文首行和报文头分别进行解析,判断请求方法是OK的情况下,判断请求方法是GET方法,然后执行解析url的操作,发现url没有带参数,获得访问路径并且告诉程序后面将执行非cgi过程。判断路径是否合法,在这个过程中,会在路径中加入index.html,也就是我自己写的简单页面。根据路径打开文件,得到文件描述符。然后生成响应报文前半部分,包括状态行(HTTP/1.0 200 OK)、响应头(Content-Type、Content-Length)、空行。先发送响应报文前半部分,然后发送响应体,也就是index.html文件sendfile(sock, rq->GetFd(), nullptr, rq->GetFileSize()),发送完毕关闭连接。
  4、浏览器收到响应报文,解析报文得到页面,关闭连接,然后输入两个大整数,点击提交,再次向服务器发起请求。三次握手成功后,accept返回接受套接字,生成一个任务,放到任务队列等待处理。
  5、处理任务:从请求报文中把报文首行、报文头分别取出来,然后对报文首行和报文头分别进行解析,判断请求方法是OK的情况下,判断请求方法是POST方法,对报文体进行获取(获取参数),获取请求路径(cgi程序的位置)。分析路径是否合法,发现是可执行程序,告诉程序接下来将用cgi的方式处理。以cgi方式处理,父进程负责将参数写入管道,子进程从管道读取参数,cgi程序处理参数,子进程将处理结果写入管道,父进程从管道读取处理结果,将结果放到response_text中。生成响应报文前半部分,包括状态行(HTTP/1.0 200 OK)、响应头(Content-Type、Content-Length)、空行。最后先发送生成的响应报文前半部分(状态行、响应头、空行),然后发送响应体(response_text),发送完毕关闭连接。
  6、浏览器收到响应报文,解析报文得到报文体中的处理结果,在页面上显示结果,关闭连接。
  在这里插入图片描述

5、 问题

  (1)在cgi技术中使用stringstream分割两个输入参数,如果是计算两个数的加减乘除时,浏览器可以得到正确的结果,但如果是huffman编码解码时,就是出现args错误,不能进行编码解码。但我在本地使用huffman编码的代码没有问题。后来发现是在分割参数时,没有正确分割,对于带参请求,192.168.3.132:8081?data1=123&data2=456,我开始分割两个参数data1=123&d,data2 =456 。这时,如果是计算两个数的加减乘除时,使用stringstream。字符串转整形,会发生截断,最后得到的结果data1=123,data2 =456 。而由于huffman编码不需要转换,所以会发生编码错误。
  (2)当客户端关闭的时候服务器会挂掉:当我用浏览器请求服务器的时候,如果在请求过程中浏览器点了叉号关闭客户端,那么我的服务器就之间挂掉了。经过研究我发现原来是因为当客户端关闭的时候,如果服务器继续写进程就会收到SIGPIPE信号,而这个信号默认的处理动作就是结束进程,所以服务器挂了。解决方法就是在初始化服务器的时候将SIGPIPE信号忽略掉signal(SIGPIPE, SIG_IGN);,这样一个客户端的关闭就不会影响整个服务器挂掉了。
 项目代码https://github.com/dzq123321/project/tree/master/Linux%E9%A1%B9%E7%9B%AEHttp%E6%9C%8D%E5%8A%A1%E5%99%A8
  Huffman代码
  https://blog.csdn.net/weixin_43688483/article/details/107614766

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值