如何处理HTTP服务器上浏览器返回-1的recv()? [重复]

问题描述 投票:0回答:1

我正在用 C 语言编写一个小型 HTTP 服务器,使用 select() 和非阻塞套接字,但我发现自己遇到了问题。

当我接受连接并尝试使用带有 1024 长度缓冲区的 recv() 函数读取 HTTP 请求(从浏览器,即 Mozilla Firefox)时。我很好地理解了整个请求。但总的来说,我不知道 recv() 是否给了我整个请求或其中的一部分,这意味着我不知道是否应该继续阅读或将 HTTP 响应发送回客户端(浏览器)。发生的情况如下:

  • 我使用recv(),所以我得到X字节。 (X 可以小于或等于 te 请求的长度)
  • 我需要知道是否有更多字节或不需读取。所以我检查recv()的返回值。我一直在调试,最终它返回一个 recv() 操作的整个请求,但我不确定是否应该依赖它,这就是我担心的原因。
  • 如果recv()操作返回0,则意味着连接已关闭(shutdown),但使用持久连接的浏览器在收到HTTP响应之前不会关闭连接。
  • 因此,recv 返回-1,errno 设置为 EAGAIN/EWOULDBLOCK。

我的问题是,如何处理这种情况:

如果recv()函数只读取了请求的一部分,或者仅当它已经到达请求的末尾并且没有更多的内容可以读取时,errno是否会被设置为EAGAIN/EWOULDBLOCK? 怎么处理?

c http sockets webserver posix-select
1个回答
1
投票

如果recv()函数只读取了请求的一部分,或者仅当它已经到达请求的末尾并且没有更多的内容可以读取时,errno是否会被设置为EAGAIN/EWOULDBLOCK?怎么处理?

都不是。如果没有更多数据可供立即读取,它将被设置为该值。

recv()
不知道来自第三方的 HTTP 请求格式。

您需要充分了解 RFC 2616 和朋友来实现 HTTP,特别是有关内容长度和分块编码的部分。你不能没有它。

© www.soinside.com 2019 - 2024. All rights reserved.