http服务器是如何判断一个请求报文发送结束
文章目录
继挖坑 tinyshell 之后,又挖新坑tinyserver, 主要是想深入研究一下网络编程的一些细节,多进程/多线程/select/poll/epoll 这些。这里记录一下我的思考,可能有误,请谨慎参考:
问题:服务器如何判断请求报文发送结束?
要想清楚这个问题,就要从http报文结构入手,一个http请求报文是长这样:
|
|
找张网上流传图片,看得更清晰
所以这里可以分为两种情况:
- 没有请求体
- 有请求体
对于没有请求体的请求,在报文最后就是:最后一个头字段后面的换行符,加上头字段和请求体之间的换行符,也就是读取到\r\n\r\n
时,就可以判断报文已经结束了。
而对于有请求体的请求(比如post请求,就会把数据放在请求体中),在\r\n\r\n
后面,还要继续读请求体的数据。而请求体的长度,能够通过请求头部中的Content-length
中获得。所以如果在请求头中发现有Content-length
字段,就还需在\r\n\r\n
后面再继续读取Content-length
所指示的字节数。
结语:
按照这个思路,我实现了代码具体可看 这里
文章作者 wuhuaji
上次更新 2019-08-12