【问题标题】:HTTP response message generated by server is not being recognized as a response服务器生成的 HTTP 响应消息未被识别为响应
【发布时间】: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):

image

我必须在发送前对消息进行编码吗?还是我的消息格式有问题?

【问题讨论】:

标签: c sockets http server


【解决方案1】:

这里有很多错误表明您只是编写了自己的 HTTP 版本而不是阅读标准。如果您想实现 HTTP,请参阅the standard 了解所有详细信息。 简而言之:

"200 OK\nContent-Type: text/html\nContent-Length: " + 以字节为单位的资源大小 + "\r\n\n"

应该是HTTP/1.1 200 OK... 而不仅仅是200 OK...。所有行尾都必须是 \r\n 而不是 \n,并且 HTTP 标头的末尾必须有一个 \r\n

“未找到 HTTP1.1 404\r\n内容长度:0\r\n\n”
"HTTP1.1 405 Method Not Allowed\r\nAllow: GET, HEAD\r\n"

应该是HTTP/1.1 而不是HTTP1.1。然后是所有其他问题。

同样,如果您真的想实现自己的 HTTP 堆栈,请研究该标准。它比你想象的要复杂得多。仅仅因为 HTTP 是基于文本的协议并不意味着它很简单,也不意味着任何文本都是正确的 HTTP 消息。此外,实现以不同的方式容忍,所以仅仅因为它适用于一个客户端(即浏览器)并不意味着它是正确的,它也可以适用于不同的客户端。

【讨论】:

  • 谢谢。我已经把你的话记在心里了。我根据标准调整了所有的 CRLF,并将其更改为 HTTP/1.1。浏览器现在加载网页就好了。但是,wireshark 仍然没有捕获 HTTP 请求/响应:(我使用环回 IP 127.0.0.1 访问网页,wireshark 没有显示来自/到 127.0.0.1 的任何数据包。可能是什么问题?
  • @0thcall:关于 Wireshark:这是一个完全不同的问题,因此应该是它自己的问题,您需要提供您正在做什么的必要细节。
猜你喜欢
  • 2020-03-01
  • 2015-05-07
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多