博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
跟我一起来用C++写web服务器吧(二)
阅读量:6222 次
发布时间:2019-06-21

本文共 1433 字,大约阅读时间需要 4 分钟。

在这个系列的第一篇文章里面,我们说到了让浏览器来接收服务器发送给它的资源,并且显示出这个HTML页面。然后,结果并没有如预期的那样。在这篇文章,我们将解决这个问题。

好的,现在我们回忆一下第一篇文章。我们已经看到了,HTML文件里面的内容已经被我们完整的获取了。所以说,不是因为HTML的内容导致失败的。

然后,我们也看到了浏览器显示:

malformed HTTP status code "/index.html"
这条信息。也就是说问题是出在了服务器那里。

我们再来审查元素看看:

发现响应出问题了。

遵循协议

在这个系列的第一篇文章里,我们谈到了协议这部分内容。而协议顾名思义就是一套标准、一套规范。谁不遵循这个规范,我就不按照你的意思去做。

关于涉及到HTTP协议的那部分内容出现在了两个地方:

我们发现,第二张图片中的响应头信息是对的。只是少了一些具体的信息,我们把她完善一些:

sprintf(buff, "HTTP/1.0 200 OK\r\n");sprintf(buff, "%sServer: HHTWS Web Server\r\n", buff);sprintf(buff, "%sContent-length: %d\r\n", buff, file_size);sprintf(buff, "%sContent-type: %s\r\n\r\n", buff, file_type);复制代码

然后我们看看第一张图片发送的信息。

因为它是从表示连接的socket文件描述符中读取信息的,因此,读到的自然也就是请求头的信息。而此时,我们又把请求头中的信息发送给浏览器,显然是不符合响应头的要求的。因此,我们把这一行删掉,来看看结果:

OK,美丽的HTML页面出现了!!

我们来审查一下元素,看看

这些不正是我们在代码里面写的响应头吗?

OK。接下来做些小小的优化。

优化

虽然write()不太可能返回一个部分写的结果。而且,对write系统调用来说没有EOF情况。对于普通文件,除非发生一个错误,否则write将保证写入所有的请求。

所以,对于普通文件,不需要进行循环写入了。然后,对于其他类型--例如套接字--大概得有个循环来保证你真的写入了所有请求的字节。

int makesure_write(int connect_fd, void* buff, int n) {    int remain_num = n;    int success_write_num = 0;    char* buff_current_postition = (char*)buff;    while (remain_num > 0) {        success_write_num = write(connect_fd, buff_current_postition, remain_num);        remain_num -= success_write_num;        buff_current_postition += success_write_num;    }    return n - remain_num;}复制代码

好了,这次的教程结束,咱们下次继续喔(u‿ฺu✿ฺ)。happy ending

转载于:https://juejin.im/post/59c7133bf265da065270a984

你可能感兴趣的文章
使用ASP.Net WebAPI构建REST服务(六)——Self-Host
查看>>
实例演示如何使用AgileEAS.NET SOA平台工作流进行业务流程自定义
查看>>
结合Spring发送邮件的四种正确姿势,你知道几种?
查看>>
使用钉钉通知你的 Laravel 框架系统异常
查看>>
【译】Vue 的小奇技(第一篇):提高大型数据列表的性能
查看>>
android中compileSdkVersion、minSdkVersion、targetSdkVersion 的选择
查看>>
0224 - 技术的道与术
查看>>
小哥哥~手把手教你如何绘制一辆会跑车
查看>>
【webpack进阶】使用babel避免webpack编译运行时模块依赖
查看>>
如何应对线上的偶现问题
查看>>
程序员你为什么这么累【续】:编码习惯之Controller规范
查看>>
【火炉炼AI】深度学习001-神经网络的基本单元-感知器
查看>>
主成分分析(PCA)
查看>>
小程序前端制作-我的
查看>>
你不知道的的 iOS 多线程
查看>>
Swift 线程安全数组
查看>>
坑系列 —— 缓存 + 哈希 = 高并发?
查看>>
Kotlin实战之Fuel的高阶函数
查看>>
Webgoat学习笔记
查看>>
Android平台下二维码漏洞攻击杂谈
查看>>