HTTP GET请求问题

时间:2011-01-19 21:23:54

标签: c++ http tcp get

我正在写一个简单的下载器。我正在尝试下载jpg图片。

void accel::download(int threads){
    char msg[] = "HEAD /logos/2011/cezanne11-hp.jpg HTTP/1.0\r\nConnection: close\r\n\r\n";
    int back = send(socketC, (const char *)&msg, strlen(msg), 0);
    char *buff = new char[500];
    back = recv(socketC, buff, 500, 0);

    cout << buff;

    char *buff2 = new char[700];
    char msg2[] = "GET /logos/2011/cezanne11-hp.jpg HTTP/1.0\r\nRange: bytes=0-400\r\nConnection: close\r\n\r\n";
    back = send(socketC, (const char *)&msg2, strlen(msg2), 0);
    back = recv(socketC, buff2, 700, 0);

    cout << back;

}

TCP连接已经初始化,我的代码的第一部分正在运行。它成功地发送HEAD消息并收回响应。但是当它试图下载图片时,recv得到0.可能出错了什么? 顺便说一下这是学校项目所以我不允许使用一些花哨的库来执行此操作。这是完整的图片地址 - http://www.google.com/logos/2011/cezanne11-hp.jpg

4 个答案:

答案 0 :(得分:4)

您没有收到任何内容,因为您告诉服务器您在指定时不想再发出第二个请求

  

连接:关闭

在您的HEAD请求中。

这告诉服务器你只会提出一个请求而不是等待一秒钟。

尝试将您的第一个请求更改为持久的“保持活动”连接。

“HEAD /logos/2011/cezanne11-hp.jpg HTTP / 1.0 \ r \ n \ nConnection:keep-alive \ r \ n \ r \ n”;

注意:如果您不希望服务器消失,您可能希望将第二个请求更改为保持活动状态。

答案 1 :(得分:1)

一般来说,HTTP会关闭套接字。 (HTTP 1.1具有持久(保持活动)连接,但您似乎已要求服务器在您的第一个命令中关闭您的连接。)

因此,请确保您的插座在首次接收后仍处于打开状态;我愿意打赌它不是。

答案 2 :(得分:0)

您是否确认图片实际上已发送给您的客户?也许你没有收到服务器的任何回复。

尝试使用wireshark检查实际的网络活动。这样可以让您准确了解发送和接收的内容。您可能无法从服务器获取任何内容,或者您​​的请求存在问题,您可能会发现实际的网络流量。

答案 3 :(得分:0)

在您完成chrisaycock所说的内容之后,您可能想要将Host:添加到您的请求中。许多共享托管和仅IP访问可能会开始失败。