JSONCPP向浏览器前端发送服务器本地文件列表
服务器解析了浏览器请求之后,要进行响应
响应体里需要存放请求的内容
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 缓冲区有以下几个好处:
-
减少系统调用次数:使用
struct iovec
可以将多个不连续的内存块一次性写入到 socket 缓冲区,从而减少了多次系统调用的开销。这样可以提高性能,特别是在需要发送大量数据或频繁的网络通信场景下。 -
提高数据发送效率:
struct iovec
允许一次性发送多个片段的数据,这些片段可以是连续的,也可以是不连续的。这样可以减少数据在内核和用户空间之间的复制和重新组织,提高数据发送的效率。 -
灵活构造响应:
struct iovec
的灵活性允许你以不同的方式构造响应数据。你可以将不同的片段按照需要组合,并在每个片段上指定特定的长度。这样可以方便地处理不同类型的数据(比如文本、二进制数据等)并自定义数据的格式。