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

时间:2016-11-28 21:06:14

标签: c sockets http select webserver

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

当我接受连接并尝试使用带有1024个长度缓冲区的recv()函数读取HTTP请求(来自浏览器,即:Mozilla Firefox)。我得到了整个请求就好了。但是一般来说,我不知道recv()是否给了我整个请求或它的一部分,这意味着我不知道我是否应该继续阅读或将HTTP响应发送回客户端(BROWSER)。会发生什么如下:

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

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

如果recv()函数只读取请求的一部分,或者仅当它已到达请求的末尾并且没有其他内容被读取时,是否将错误设置为EAGAIN / EWOULDBLOCK? 如何处理?

提前谢谢你 PS:我希望我已经解释得很好,所以你可以理解并试图帮助我。

1 个答案:

答案 0 :(得分:1)

  

如果recv()函数只读取请求的一部分,或者仅当它已到达请求的末尾并且没有其他内容被读取时,是否将错误设置为EAGAIN / EWOULDBLOCK?如何处理?

都不是。如果没有更多数据可以立即读取,它将被设置为该值。 recv()不知道来自三垒的HTTP请求格式。

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