http服务器

这篇具有很好参考价值的文章主要介绍了http服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目介绍

这个项目是一个基于线程池IO模型实现的网络通信http服务器。

项目框架

项目大致由4个部分组成。

1、tcp服务器,用于建立TCP连接。

2、http服务器,建立监听套接字,将接收到的新的套接字push到线程池中的任务队列中,

3、线程池中的线程循环处理任务队列中的任务,调用回调方法,也就是执行IO通信。

4、IO通信就是任务执行回调的方法。在这里完成http报文的接收、解析和构建响应报文,并发送响应报文的工作。

读取的过程按行读取,直到遇到空行,请求行和请求报头就读完了。空行的后边便是正文部分。

解析请求行的过程是按空格提取字段信息的。

解析请求报头是按空格加冒号的格式提取头部字段信息。

  

http服务器,C++,http,网络协议,网络

技术点

线程池

线程池中维护着一个任务队列和若干线程,需要互斥锁和条件变量结合使用。条件变量维护任务队列的同步互斥锁则维护线程的同步。即一种生产者消费者模型的线程池。

http服务器,C++,http,网络协议,网络

cgi

cgi是将http接收到的参数,传递给cgi程序执行,再将执行结果返还给http发送给客户端。

http是如何将参数传递给cgi程序,cgi程序又是如何将结果返还给http的呢?

首先,我们得直到http传参的方式分为get和post传参,get通过url传参,post则通过http正文传参。

get通过url传参,因为url毕竟有长度,因此可以通过环境变量传递。而post通过http正文传参,其长度无法预测,采用匿名管道的方式传参。

http接收到参数,然后交给cgi程序执行,这个过程可以看作是两个进程的执行过程,可以采用程序替换,使用execl系列函数实现。

程序替换之后,使用匿名管道的文件句柄等数据也被替换了。但是我们深知默认的标准输出、标准输入和标准错误的文件句柄是0、1、2。因此在执行execl之间,对使用匿名管道的文件句柄进行重定向,这便完成了http和cgi之间的通信。

ps(cgi接收post传递的参数时,http需要先将请求头部中的Content-Length字段通过环境变量的方式告知cgi,这样cgi才能准确接收post正文部分的参数)。

http服务器,C++,http,网络协议,网络

项目反思

这里思考的主要时cgi部分http与cgi程序通信的过程。

execl系列函数执行,环境变量不会被替换吗?因为环境变量具有全局属性,不会被替换掉。

为什么会选择匿名管道进行通信?原因如下:

1、匿名管道只允许亲缘关系进程单向通信(符合)

2、匿名管道内部保证了同步机制,从而保证数据访问的一致性。且面向字节流(安全性)

为什么不考虑其他的通信方式?

命名管道?命名管道是通过文件名+路径的方式让不同进程看见同一分资源的,也就是说该资源存在磁盘上,如若操作不当,便会出错。

共享变量?通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。共享变量大多和信号量搭配使用。

套接字?类似杀鸡用牛刀的感觉。

综上匿名管道的特点是最符合http和cgi程序之间通信的方式。文章来源地址https://www.toymoban.com/news/detail-704936.html

到了这里,关于http服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初识http协议,简单实现浏览器和服务器通信

    平时俗称的 “网址” 其实就是说的 URL,例如在百度上搜索一个C++ 可以看到这段网址前面有个 https 那么这个就代表着使用的是https协议,现在都是使用https协议,不过还是需要认识以下http协议 像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。

    2024年02月14日
    浏览(36)
  • Java服务器调用Python服务器进行交互:基于Http协议的Restful风格调用(Springboot/FastApi)

    实现Java服务器调用Python服务器进行交互以及数据传输,可采用以下方法,亲测有效: 基于Restful风格进行请求调用: 框架 : Java服务器采用Springboot框架进行搭建服务 python服务器采用FastApi框架进行搭建服务 思路 :前端–Java–python–Java–前端 代码设计 :Axios-@PostMapping-请求

    2024年04月26日
    浏览(35)
  • 〖Web全栈开发③〗—HTTP协议和静态web服务器

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! TCP (Transmission Control Protocol) 是在互联网协议(IP)上的一种基于连接(面向连接)的传输层协议 。数据

    2024年02月05日
    浏览(30)
  • 【网络进阶】HTTP服务器(一)

    HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于传输超文本数据(如HTML、图片、视频等)的应用层协议。它允许互联网上的客户端和服务器之间通过请求和响应进行双向通信。HTTP 是互联网的基石,为 Web 浏览器和 Web 服务器之间的数据交换提供了标准规范。 HTTP 基

    2024年02月02日
    浏览(31)
  • 个人网站搭建 服务器http切换到https 网站协议切换到https

    博主自行搭建一个个人网站,国内的服务器和域名都要实名或者备案,觉得太麻烦了;于是用的是国外的,用的是知速云+cf。写这篇文章主要是想记录一下几天踩过的坑,帮助大家更快搭建好自己的网站。(同时也方便自己日后回顾) 推荐通过docker进行安装,方便管理。 1)

    2024年01月17日
    浏览(38)
  • [C++ 网络协议] 多进程服务器端

    具有代表性的并发服务器端实现模型和方法: 多进程服务器:通过创建多个进程提供服务。✔ 多路复用服务器:通过捆绑并统一管理I/O对象提供服务。 多线程服务器:通过生成与客户端等量的线程提供服务。 目录 1. 进程的概念及应用 1.1 什么是进程? 1.2 创建进程 1.2.1 进程

    2024年02月11日
    浏览(25)
  • [网络编程]UDP协议,基于UDP协议的回显服务器

    目录 1.UDP协议介绍 2.UDP协议在Java中的类 2.1DatagramSocket类 2.2DatagramPacket 3.回显服务器 3.1Sever端  3.2Client端   UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。 常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输

    2024年01月22日
    浏览(39)
  • SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

    配置nginx.conf文件,这个文件一般在/etc/nginx/...中,由于每个人的体质不一样,也有可能在别的路径里,自己找找... 证书存放位置,可自定义存放位置 两个文件 后端配置 把.pfx拷贝到resource下,然后配置一下yml

    2024年02月02日
    浏览(51)
  • WebDav协议相关软件@简单配置局域网内的http和WebDav服务器和传输系统

    windows自带 IIS webdav windows自带的服务,启用相关功能后还要进行一系列的配置 而且在WebDav客户端上传到站点的文件大小存在限制问题 总体体验并不好,因此推荐第三方专业软件,灵活而且易于配置 第三方软件 CuteHttpFileServer | iscute.cn👺 提供了windos端的命令行程序和图形界面程序

    2024年01月21日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包