【发布时间】:2021-01-09 04:21:01
【问题描述】:
我正在用 C 编写一个简单的 Web 服务器。服务器生成的 HTTP 消息存储在缓冲区中并发送(通过 send()),如下所示:
场景 1:
"200 OK\nContent-Type: text/html\nContent-Length: " + 以字节为单位的资源大小 + "\r\n\n"
使用 snprintf 将资源大小(以字节为单位)转换为 char 数组,然后连接到字符串中。
场景 2:
“HTTP1.1 404 未找到\r\n内容长度:0\r\n\n”
场景 3:
"HTTP1.1 405 Method Not Allowed\r\nAllow: GET, HEAD\r\n"
这些是标头,它们是预先发送的。之后发送消息体如下:
char resource[length];
int numRead;
while ( (numRead= read(filefd, resource, length)) > 0 )
send(client, resource, length, 0);
当我使用wireshark 时,它不会将其识别为HTTP 响应。当我使用 firefox 时,网页会继续加载,直到我关闭服务器,此时它会显示 HTTP 响应而不是网页(index.html):
我必须在发送前对消息进行编码吗?还是我的消息格式有问题?
【问题讨论】:
-
你有
\r\n和\n的虚假混合。 HTTP 响应标头的每一行都必须以\r\n结尾。特别是标头仅以\r\n\r\n结尾。