【发布时间】:2016-07-05 22:45:30
【问题描述】:
我必须(作为作业)用 C 语言编写一个小型 HTTP/1.0 服务器。
这是我的问题:我不知道如何处理客户端请求的页面尺寸非常大的情况。
我认为最好先读取整个文件,然后开始向客户端发送回复(包括状态行和标题),主要原因是我可以适当地设置状态码。例如,假设服务器已经读取并存储为客户端想要的文件的一半字符串,read() 失败。然后我会继续设置“HTTP/1.0 500 Internal server error”作为状态行。
这种方法的问题是,如果文件很大,它会占用太多内存(并且由于每个连接都由单独的线程处理,如果多个线程将相当大的文件存储为字符串,那么内存使用量会增加更糟)。
作为一种解决方案,我考虑打开文件,发送状态行和标题,然后将给定数量(不太大)的字节读入缓冲区并迭代发送缓冲区中的内容,直到我读完/发送整个文件。
这解决了问题,但同样,如果read() 在文件进行到一半时失败了怎么办?由于内部错误,客户端请求无法完成,因此 500 状态码是合适的,但我已经通过套接字发送了 200 OK 消息!
这个问题通常在 HTTP 服务器中是如何处理的?
【问题讨论】:
-
在同一个文件上成功调用
read()后,您希望read()遇到哪个错误?我在实践中看到的唯一一个是EINTR,它是无害的。此外,根据您的平台,您可能有更好的选择,例如sendfile()。