一种基于C语言的HTTP服务器

著录项
  • CN201910426800.2
  • 20190520
  • CN111970316A
  • 20201120
  • 天津科技大学
  • 苏静;许天琪;梁倩;吴江红;陈少波;郝霞
  • H04L29/08
  • H04L29/08 H04L29/06 G06F8/30 G06F16/955

  • 天津市经济技术开发区第十三大街9号天津科技大学计算机学院
  • 天津(12)
摘要
本发明涉及运行在linux环境下的一个静态的HTTP服务器。发明主要目标是呈现给用户一个简单高效轻量级,支持非阻塞IO,支持高并发,支持多线程,支持配置文件读写的HTTP服务器。本发明以Linux操作系统为开发环境,用C语言开发,同时调用了Linux的系统API来实现。高并发是用epoll实现,非阻塞IO是用fcntl实现,当然多线程也是用Linux底层的函数的。本发明的线程池是用生产者消费者模型来实现的,当有多个请求同时过来时系统就会把请求依次放入请求队列,服务器启动时会开启多个线程,当队列有没处理的请求时线程会自动响应。本发明开发的IDE是sublime text 2,在设计与开发中的设计方案和流程都是严格按照软件开发流程进行的,括需求的分析、开发可行性的研究、总体设计的框架的实现和系统测试等。
权利要求

1.一种基于C语言的HTTP服务器,其特征在于,本发明是运行在linux环境下的一个静态的HTTP服务器。发明主要目标是呈现给用户一个简单高效轻量级,支持非阻塞IO,支持高并发,支持多线程,支持配置文件读写的HTTP服务器。

2.根据权利要求1所述的基于C语言的HTTP服务器,其特征是,以Linux操作系统为开发环境,用C语言开发,同时调用了Linux的系统API来实现。高并发是用epoll实现,非阻塞IO是用fcntl实现,多线程也是用Linux底层的函数的。本发明的线程池是用生产者消费者模型来实现的,当有多个请求同时过来时系统就会把请求依次放入请求队列,服务器启动时会开启多个线程,当队列有没处理的请求时线程会自动响应。

3.根据权利要求1所述的基于C语言的HTTP服务器,其特征是,在浏览器的地址栏输入网址,当浏览器敲回车的时候,浏览器会根据HTTP协议的规则,通过网络把信息包装陈HTTP报头发送到服务器终端,这时服务器接收到消息,服务器对浏览器发送过来的HTTP报头进行解析,得到浏览器请求需要的资源,服务器就会对自己的硬盘是否是有浏览器需要的资源,当到的时候,会把资源进行处理,再依据HTTP协议把浏览器所需的资源发送到浏览器。

说明书
技术领域

本发明属于技术开发领域,尤其是一种基于C语言的HTTP服务器。

随着计算机技术的日新月异和互联网技术的发展,上网的需求对于大众也越来越强烈,网上购物,浏览新闻,网页游戏,受到大众的特别的喜爱。浏览网页的时候,网站的后台服务器就起到了关键的作用,虽然HTTP服务器在后台不被我们感知但是服务器的作用不可或缺,浏览商品,购物,这些习以为常的事件都需要服务器的支撑。打开浏览器输入网址回车后,HTTP服务器响应请求,就会把信息传给浏览器然后呈现在用户面前。比较著名的Web服务器有Apache Httpd、Nginx、IIS。这些软件运行在世界各地为大众上网提供高效的服务。我们所熟知的HTTP服务器成熟的软件是为了大众的需求,不会太考虑单一企业的特殊需求,于是本发明开发一个HTTP服务器实现这个特殊需求。

本发明是在Linux环境下实现一个高性能的HTTP服务器,这个HTTP服务器的框架尽可能简单,在简单易懂的情况下可以实现实用性。在浏览器的地址栏输入网址,当浏览器敲回车的时候,浏览器会根据HTTP协议的规则,通过网络把信息包装陈HTTP报头发送到服务器终端,这时服务器接收到消息,服务器对浏览器发送过来的HTTP报头进行解析,得到浏览器请求需要的资源,服务器就会对自己的硬盘是否是有浏览器需要的资源,当到的时候,会把资源进行处理,再依据HTTP协议把浏览器所需的资源发送到浏览器。

本发明的优点和积极效果是:

本发明的HTTP服务器是以Linux操作系统为开发环境,基于C语言进行的开发,同时调用了Linux的系统API来实现。是一个简单高效轻量级,支持非阻塞IO,支持高并发,支持多线程,支持配置文件读写的HTTP服务器。

图1是本发明的HTTP服务器的基本的架构。

图2是本发明的IO流的数据结构。

图3是本发明的句柄触发图解。

图4是本发明的HTTP模块解析请求。

图5是本发明的线程池。

以下结合附图对本发明做进一步说明。

如图1所示,本发明的HTTP服务器的基本的架构分为三层,一是实现事件循环,二是HTTP服务器是非阻塞IO的,第三个是请求的任务都加入到线程池。这样能有效处理请求,也不会因为有很多的请求而使一些任务饥饿,这样性能就提升了。

IO流的封装。在传统的IO流中是不稳定的,当数据在网络中,传输的过程中,如果遇到了信号的干扰,这就会导致IO流的异常,遇到了异常后读取的数据是不保证全部读取完的,就不能保证接收到的数据是完整的。这就导致了传输的错误,所以本发明对传统的IO流进行了封装,使线程是安全的。IO流的数据结构如图2。

解析类功能实现。在系统开始的时候需要读取配置文件的信息,得到系统文件存放的根目录的路径,和启动线程池时启动的线程的个数。当浏览器发送了一个请求到服务器时,当句柄触发时,按照图3进行处理。当服务器接受到请求时,读取请求报头解析后,存入结构体,结构体中保存解析后的各个数据,供以后的函数调用时使用。浏览器发送HTTP报头后,HTTP模块解析请求,读取数据。具体的流程图如图4所示。

线程池。本发明线程池是基于生产者消费者模型建立的,当有任务时,加入到线程池,执行的函数从线程池中取任务,然后执行。这里涉及到一个问题,当一个线程到线程池取任务时需要锁定线程池,当线程池没有任务时,这时需要对线程池解锁否则无法加入新的任务,这时需要函数pthread_cond_wait,pthread_cond_wait函数在没有返回时会对线程池解锁,当加入任务到线程池时用函数pthread_cond_signal发信号,当pthread_cond_wait返回时,再次把线程池锁住,执行任务。线程池的生产者消费者模型,流程示意如图5所示。

本发明的服务器系统的功能分几个模块来进行的,一个模块式是服务器处理链接的数量,既然是高并发的就应该能够承受很高的链接压力,还有另外一个是服务器获取请求后响应的结果。其中,响应类的功能是包含了基本的得到请求体,对请求体进行解析,然后根据解析的结果来响应。

需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明包括并不限于具体实施方式中所述的实施例,凡是由本领域技术人员根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。

本文发布于:2024-09-25 09:28:26,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/74426.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议