我正在用 C 语言编写一个小型 HTTP 服务器,使用 select() 和非阻塞套接字,但我发现自己遇到了问题。
当我接受连接并尝试使用带有 1024 长度缓冲区的 recv() 函数读取 HTTP 请求(从浏览器,即 Mozilla Firefox)时。我很好地理解了整个请求。但总的来说,我不知道 recv() 是否给了我整个请求或其中的一部分,这意味着我不知道是否应该继续阅读或将 HTTP 响应发送回客户端(浏览器)。发生的情况如下:
我的问题是,如何处理这种情况:
如果recv()函数只读取了请求的一部分,或者仅当它已经到达请求的末尾并且没有更多的内容可以读取时,errno是否会被设置为EAGAIN/EWOULDBLOCK? 怎么处理?
如果recv()函数只读取了请求的一部分,或者仅当它已经到达请求的末尾并且没有更多的内容可以读取时,errno是否会被设置为EAGAIN/EWOULDBLOCK?怎么处理?
都不是。如果没有更多数据可供立即读取,它将被设置为该值。
recv()
不知道来自第三方的 HTTP 请求格式。
您需要充分了解 RFC 2616 和朋友来实现 HTTP,特别是有关内容长度和分块编码的部分。你不能没有它。