【问题标题】:Why do my HTTP/1.0 GET request returns OK but no body content?为什么我的 HTTP/1.0 GET 请求返回 OK 但没有正文内容?
【发布时间】:2012-01-04 03:42:25
【问题描述】:

我正在用 C 语言制作一个简单的 http 页面请求器。它使用套接字向主机发送 HTTP/1.0 GET 请求,并解析答案以有效下载 html 文件。 但是,当我发送这样的请求时:

GET http://stackoverflow.com/questions HTTP/1.0
User-Agent: myRequester/1.0

它返回这个

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Mon, 19 Dec 2011 15:28:08 GMT
Content-Length: 54362
Connection: close

但没有正文内容。

是的,我已将 CRLF 放在每一行的末尾,并在末尾放置一个空行。 我通过一个连接只使用一个套接字。而且我还必须坚持使用 HTTP/1.0。

【问题讨论】:

  • 您确定您确实在阅读完整的回复吗?这些标头确实表明服务器正在发送正文。
  • 是的,我确定。我已经通过 recv() 返回检查了答案长度,之后还对缓冲区进行了 strlen()。
  • 但是你读到最后了吗?请注意,recv 不一定会在一次调用中读取完整的响应;您应该重复调用,直到 recv 报告连接已结束。
  • 您多次致电recv,对吗?顺便说一句:您是否尝试过远程登录并输入您的请求以查看会发生什么?例如:telnet stackoverflow.com 80。 (如果你有nc,这甚至比telnet更好。)
  • 非常抱歉。你俩都是对的。我没有多次调用 recv() 。问题在于我对套接字实现的解释。既然我无法删除我的问题,我是否应该自己回答并解释,这样其他人就不会犯同样的错误?

标签: http sockets


【解决方案1】:

最可能的解释是服务器实际上正在发送一个正文,但您并没有阅读所有正文。大多数网络系统不一定会在一个函数调用中返回所有响应,因为它们认为立即返回可用的数据很有用,即使预期会有更多。

当连接结束时,Unix 系统调用recv 返回零。你应该一直调用它,直到你得到零或错误。

【讨论】:

  • 完全正确。很抱歉浪费了这样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2014-07-09
  • 2017-07-16
  • 2021-12-13
  • 2020-03-15
  • 2017-01-16
相关资源
最近更新 更多