跟我一起来用C++写web服务器吧(二)

在这个系列的第一篇文章里面,我们说到了让浏览器来接收服务器发送给它的资源,并且显示出这个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值