Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的HTTP/1.0 GET请求返回OK但没有正文内容?_Http_Sockets - Fatal编程技术网

为什么我的HTTP/1.0 GET请求返回OK但没有正文内容?

为什么我的HTTP/1.0 GET请求返回OK但没有正文内容?,http,sockets,Http,Sockets,我正在用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:

我正在用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。

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


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

您确定您正在读取完整的响应吗?这些标题确实表示服务器正在发送一个主体。是的,我确定。我已经通过recv()返回检查了答案的长度,然后strlen()对缓冲区进行了修改。但是你读到最后了吗?请注意,recv不一定在一次调用中读取完整响应;您应该重复呼叫,直到recv报告连接已结束。您正在呼叫
recv
多次,对吗?顺便说一句:你有没有试过直接上网并输入你的请求,看看会发生什么?例如:
telnet stackoverflow.com 80
。(如果你有
nc
,那就比
telnet
更好了。)我非常抱歉。你们都是对的。我没有多次调用recv()。问题在于我对套接字实现的解释。既然我不能删除我的问题,我应该自己回答吗?解释一下,这样别人就不会犯和我一样的错误了?绝对正确。我很抱歉浪费了这样一个问题。