如何处理从 HTTP 服务器上的浏览器返回 -1 的 recv()?
How to handle recv() returning -1 from Browser on HTTP Server?
我正在使用 select() 和非阻塞套接字在 C 上编写一个小型 HTTP 服务器,但我发现自己遇到了问题。
当我接受连接并尝试使用具有 1024 长度缓冲区的 recv() 函数读取 HTTP 请求(来自浏览器,即:Mozilla Firefox)时。我得到了整个请求就好了。但一般来说,我不知道 recv() 是否给了我整个请求或它的一部分,这意味着我不知道我是否应该继续阅读或将 HTTP 响应发送回客户端(浏览器)。情况如下:
- 我使用 recv(),所以我得到了 X 个字节。 (X 可以小于或等于 te 请求的长度)
- 我需要知道是否还有更多字节需要读取。所以我检查了 recv() 的 return 值。我一直在调试,最终它 return 是对一个 recv() 操作的整个请求,但我不确定我是否应该依赖它,这就是我担心的原因。
- 如果 recv() 操作为 return 0,则表示连接已关闭(关闭),但使用持久连接的 BROWSER 在收到 HTTP 响应之前不会关闭连接。
- 因此,recv returns -1 和 errno 设置为 EAGAIN/EWOULDBLOCK.
我的问题是,如何处理这种情况:
如果 recv() 函数只读取请求的一部分,或者仅当它已到达请求的末尾并且没有更多可读取时,errno 是否会设置为 EAGAIN/EWOULDBLOCK?
如何处理?
提前致谢
PS:我希望我已经把自己解释得足够好,以便您能理解并尝试帮助我。
Will errno be set to EAGAIN/EWOULDBLOCK if the recv() function only read a piece of the request, or only if it has reached the end of the request and there is no more to be read? How to handle that?
都没有。如果没有更多的数据可以立即读取,它将被设置为该值。 recv()
不知道来自三垒的 HTTP 请求格式。
您需要对 RFC 2616 和朋友有很好的了解才能实现 HTTP,特别是关于内容长度和分块编码的部分。你离不开它。
我正在使用 select() 和非阻塞套接字在 C 上编写一个小型 HTTP 服务器,但我发现自己遇到了问题。
当我接受连接并尝试使用具有 1024 长度缓冲区的 recv() 函数读取 HTTP 请求(来自浏览器,即:Mozilla Firefox)时。我得到了整个请求就好了。但一般来说,我不知道 recv() 是否给了我整个请求或它的一部分,这意味着我不知道我是否应该继续阅读或将 HTTP 响应发送回客户端(浏览器)。情况如下:
- 我使用 recv(),所以我得到了 X 个字节。 (X 可以小于或等于 te 请求的长度)
- 我需要知道是否还有更多字节需要读取。所以我检查了 recv() 的 return 值。我一直在调试,最终它 return 是对一个 recv() 操作的整个请求,但我不确定我是否应该依赖它,这就是我担心的原因。
- 如果 recv() 操作为 return 0,则表示连接已关闭(关闭),但使用持久连接的 BROWSER 在收到 HTTP 响应之前不会关闭连接。
- 因此,recv returns -1 和 errno 设置为 EAGAIN/EWOULDBLOCK.
我的问题是,如何处理这种情况:
如果 recv() 函数只读取请求的一部分,或者仅当它已到达请求的末尾并且没有更多可读取时,errno 是否会设置为 EAGAIN/EWOULDBLOCK? 如何处理?
提前致谢 PS:我希望我已经把自己解释得足够好,以便您能理解并尝试帮助我。
Will errno be set to EAGAIN/EWOULDBLOCK if the recv() function only read a piece of the request, or only if it has reached the end of the request and there is no more to be read? How to handle that?
都没有。如果没有更多的数据可以立即读取,它将被设置为该值。 recv()
不知道来自三垒的 HTTP 请求格式。
您需要对 RFC 2616 和朋友有很好的了解才能实现 HTTP,特别是关于内容长度和分块编码的部分。你离不开它。