为什么recv()在所有for循环迭代中返回'0'字节,除了第一个?

时间:2011-05-29 11:36:14

标签: http sockets recv

我正在用C ++编写一个小型网络程序。除其他外,它必须下载推特个人资料图片。我有一个URL列表(stl :: vector)。我认为我的下一步是创建for循环并通过套接字发送GET消息并将图片保存到不同的png文件中。问题是,当我发送第一条消息,收到答案段并保存png数据时,所有事情似乎都没问题。但是在下一次迭代中,通过相同套接字发送的相同消息通过recv()函数产生0个接收字节。我通过向循环体添加套接字创建代码解决了这个问题,但我对套接字概念有点困惑。看起来当我发送消息时,应该关闭套接字并再次重新创建以将下一条消息发送到同一服务器(以获取下一个图像)。这是套接字网络编程的正确方法,还是可以通过同一个套接字接收多条HTTP响应消息?

提前致谢。

UPD:这是我创建套接字的循环代码。

    // Get links from xml.
    ...
    // Load images in cycle.
    int i=0;
    for (i=0; i<imageLinks.size(); i++)
    {
        // New socket is returned from serverConnect. Why do we need to create new at each iteration?
        string srvAddr = "207.123.60.126";
        int socketImg = serverConnect(srvAddr);
        // Create a message.
        ...
        string message = "GET " + relativePart;
                message += " HTTP/1.1\r\n";
        message += "Host: " + hostPart + "\r\n";
        message += "\r\n";
        // Send a message.
        BufferArray tempImgBuffer = sendMessage(sockImg, message, false);
        fstream pFile;
        string name;
        // Form the name.
        ...
        pFile.open(name.c_str(), ios::app | ios::out | ios::in | ios::binary);
        // Write the file contents.
        ...
        pFile.close();
        // Close the socket.
        close(sockImg);
    }

2 个答案:

答案 0 :(得分:6)

另一方正在关闭连接。这就是HTTP/1.0的工作原理。你可以:

  • 为每个HTTP GET建立不同的连接
  • HTTP/1.0与非官方Connection: Keep-Alive
  • 一起使用
  • 使用HTTP/1.1。在HTTP 1.1中,除非另有声明,否则所有连接都被视为持久连接。

强制性xkcd链接 Server Attention Span

<强> Wiki HTTP

  

HTTP的原始版本   (HTTP / 1.0)在HTTP / 1.1中进行了修订。   HTTP / 1.0使用单独的连接   每个人都有相同的服务器   请求 - 响应事务,而   HTTP / 1.1可以重用连接   多次

答案 1 :(得分:3)

原始形式的HTTP(HTTP 1.0)确实是“每个连接一个请求”协议。一旦你收到回复,另一方可能已经关闭了连接。一些实现中添加了非官方机制来支持每个连接的多个请求,但它们没有标准化。

HTTP 1.1 turns this around。默认情况下,所有连接都是“持久的”。

要使用此功能,您需要在请求行的末尾添加“HTTP / 1.1”。不是GET http://someurl/,而是GET http://someurl/ HTTP/1.1。您还需要确保在执行此操作时提供“Host:”标题。

但请注意,即使是其他一些兼容的HTTP服务器也可能不支持持久连接。还要注意,连接实际上可以在很少的延迟,一定数量的请求之后或者随机地丢弃。您必须为此做好准备,并准备重新连接并在您离开的地方继续发出请求。

另请参阅HTTP 1.1 RFC