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