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

64次阅读
没有评论

共计 1763 个字符,预计需要花费 5 分钟才能阅读完成。

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

制作流程

观察收到的 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 请求,不信我们看下我们的服务器收到的信息:

先观察一会儿, 看起来 *** 行是 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

服务器收到的信息:

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

解析 request 的 method url version

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

1.request.h

2.request.c

3. 编写测试用例

在 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 就行了

关键代码:

解析 body

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

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

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

打印解析内容

执行 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 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计1763字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)