如何理解C语言编写Http服务器中的Request

这篇文章将为大家详细讲解有关如何理解C语言编写Http服务器中的Request,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联公司是一家集网站建设,云溪企业网站建设,云溪品牌网站建设,网站定制,云溪网站建设报价,网络营销,网络优化,云溪网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

制作流程

  • 观察收到的http数据

  • 解析 request 的 method url version

  • 解析 header

  • 解析 body

观察收到的http数据

如果你能完成一个简单的基于TCP/IP的socket server  程序,那么恭喜你,本文你可以好好读一读。HTTP正式基于TCP/IP的应用层协议,所以只要我们的程序能读懂HTTP数据,并做出符合HTTP协议的响应,那么就能完成HTTP的通信。

如果你有机会,可以常识使用telnet连接我们的服务器,你将的得到得是一些没有意义的字符。如果是浏览器,会传送什么呢?我们试着在浏览器地址栏输入我们的服务器地址:  127.0.0.1:9734 后访问,发现浏览器说“127.0.0.1 发送的响应无效。”,  那是说我们返回给浏览器的数据浏览器读不懂,因为现代的浏览器默认用http协议请求访问我们的服务器,而我们的返回的数据只是"helloworld"字符串,并不符合http协议的返回格式。虽然如此,但浏览器却是很有诚意的给我们的服务器发标准的http请求,不信我们看下我们的服务器收到的信息:

如何理解C语言编写Http服务器中的Request

先观察一会儿,看起来***行是http请求的类型,第二行开始是一些":"号分割的键值对。的确如此,***行告诉我们是用的GET请求,请求的url是"/",用的是1.1的HTTP版本。第二行开始是HTTP的请求头部。除了GET请求外,另一种常用的请求是POST。用浏览器发POST请求稍麻烦,我们就借用curl工具来发送个HTTP  POST请求给服务器看下数据又会是怎们样的:curl -d "message=nice to meet you"  127.0.0.1:9734/hello

服务器收到的信息:

如何理解C语言编写Http服务器中的Request

可以看到头部信息之后多了一空行和之后的POST的body数据信息。还要注意的是Content-Length头,代表POST的body数据的大小。

解析 request 的 method url version

先来解析最简单的***行: "POST /hell HTTP/1.1", 只需要用空格split出三个字符串就好了。

1.request.h

如何理解C语言编写Http服务器中的Request

2.request.c

如何理解C语言编写Http服务器中的Request

3.编写测试用例

如何理解C语言编写Http服务器中的Request

在test目录下执行:` gcc ../request.h ../request.c requestTest.c &&  ./a.out`,可以看到我们解析的方法正确。

解析 header

header的解析看起来比较复杂,每一行很容易看出是用":"分割的key-value对,所以我们可以用HashMap来表达。如何判断header数据的结束呢,通过前面的观察,可以发现如果是POST会有一个空行和body隔开,是GET的话只能检查客户端的数据是否发完,发完就代表header也结尾了。在正式解析header之前,我们先构造基本数据的数据结构,以方便以后使用。

  • 1. 创建链表结构体

  • 2. 创建哈希表结构体

  • 3. 按行解析header,遇到空行或字符串结尾停止

因为代码比较多,这里不久不把两种结构体得实现代码贴出来,如果足下需要可以私信我"代码"获取。

解析header代码,有了哈希结构体后,解析header就方便多了,只要按行根据":" 拆分成 key和value就行了

关键代码:

如何理解C语言编写Http服务器中的Request

解析body

解析body很简单,如果***一行不是空格不是空行,说明是有body数据的,空行后面的就是body数据了.

header里面有个关键的key, ‘Content-Length’ 代表了body有多长,我们可以利用这个字段来判断body的结尾。

如何理解C语言编写Http服务器中的Request

大功告成 ***打印我们的成果

打印解析内容

如何理解C语言编写Http服务器中的Request

执行 gcc request.h request.c main.c tools/utils.c tools/utils.h &&  ./a.out

然后新开一个终端执行 curl -d "message=nice to meet you"  127.0.0.1:9734/hello-everyone

看到输出结果:

如何理解C语言编写Http服务器中的Request

关于如何理解C语言编写Http服务器中的Request就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

当前标题:如何理解C语言编写Http服务器中的Request
标题路径:https://www.cdcxhl.com/article34/pdgcse.html

成都网站建设公司_创新互联,为您提供全网营销推广品牌网站设计做网站关键词优化网站营销微信公众号

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司