JSONCPP向浏览器前端发送服务器本地文件列表

synapse331 / 2023-09-02 / 原文

服务器解析了浏览器请求之后,要进行响应

响应体里需要存放请求的内容

HTML标签:是页面的核心内容,定义了页面有什么内容。

CSS:控制HTML元素的排版布局和展示方式,是美化页面文档的。

JavaScript:让用户与页面进行交互,或在网页背后默默操控网页,以便让显示的内容与效果有所改变。对网页来说就是上帝之手。

请求内容包括html、css、js,这些是网页核心组件,此外在服务器端设计中关注的最主要的是请求的资源

要正确返回资源,首先需要正确解析请求的是什么path

path有三种情况:

login, register,index,welcome这种非请求静态资源的目录

picture,video请求资源

upload,上传资源,download,请求服务器某个预设路径下的文件写入json中

解析好的路径最后用path变量表示

点击图片的请求:

1.picture.html 几次

2."/css/bootstrap.min.css"

3."/css/magnific-popup.css"

4."/css/animate.css"

5."/css/bootstrap.min.css"

6."/css/animate.css" (this).mmFile 0.0

7."/css/magnific-popup.css"

8."/css/style.css"

9."/css/font-awesome.min.css"

请求到的图片顺序也不是按照1234

 

 

解析完成之后生成响应:makeResponse完成,NO REQUEST不用生成响应,因为表明请求还不完整。GET REQUEST和BAD REQUEST则进行响应应答。

响应状态行、响应头向writeBuffer中写入string,写入的内容由解析时的完成情况确定。

首先要构造这个响应体里的内容,响应体里的内容可以是很多种编码类型,只要在响应头里指明并且浏览器支持这种解码就可以,比如json。

响应体内容生成经历几个步骤。1.确定请求的静态文件的path。有可能是html、css、js或者是服务器的展示图片以及视频。如果是这一类的情况,就获取对应文件的文件信息属性(stat函数)存在结构体里,然后将这个文件映射到内存里提高数据读取效率。

返回一个指针指向这个文件所在的内存地址。如果是请求下载服务器某个文件夹下的内容的话,因为它可能涉及到多个文件,比较复杂,就选用json这种比较轻量级的数据传输格式,把指定文件夹下的文件写入json里键值对结构体保存在本地,最后跟之前的过程一样的,把json文件映射到内存里。

把这个响应体写入响应时利用iov结构体,iov[0]中存放状态行跟响应头的内容,iov[1]中存放请求的响应体内容,调用写函数将这些内容依次写入到socket的缓冲区里.

如果按上面的顺序打断点观察,会发现最先请求的是html,接着css、js最后是list.json,也就是那个目录下的文件。

 

使用 struct iovec 结构体将响应写入到 socket 缓冲区有以下几个好处:

  1. 减少系统调用次数:使用 struct iovec 可以将多个不连续的内存块一次性写入到 socket 缓冲区,从而减少了多次系统调用的开销。这样可以提高性能,特别是在需要发送大量数据或频繁的网络通信场景下。

  2. 提高数据发送效率:struct iovec 允许一次性发送多个片段的数据,这些片段可以是连续的,也可以是不连续的。这样可以减少数据在内核和用户空间之间的复制和重新组织,提高数据发送的效率。

  3. 灵活构造响应:struct iovec 的灵活性允许你以不同的方式构造响应数据。你可以将不同的片段按照需要组合,并在每个片段上指定特定的长度。这样可以方便地处理不同类型的数据(比如文本、二进制数据等)并自定义数据的格式。