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

为什么recv()返回';0';循环迭代的字节数,除了第一个? 我正在用C++编写一个小型网络程序。除此之外,它还必须下载twitter个人资料图片。我有一个URL列表(stl::vector)。我认为我的下一步是创建for循环,通过套接字发送GET消息,并将图片保存到不同的png文件中。问题是,当我发送第一条消息、接收答案片段并保存png数据时,一切似乎都很好。但在下一次迭代中,通过同一套接字发送的同一消息通过recv()函数生成0个接收字节。我通过向循环体中添加套接字创建代码解决了这个问题,但是我对套接字的概念有点困惑。看起来,当我发送消息时,应该关闭套接字并重新创建,以便将下一条消息发送到同一服务器(以便获得下一个映像)。这是套接字网络编程的正确方式,还是可以通过同一个套接字接收多个HTTP响应消息,http,sockets,recv,Http,Sockets,Recv,提前谢谢 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

提前谢谢

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);
    }
//从xml获取链接。
...
//循环加载图像。
int i=0;

对于(i=0;i另一端正在关闭连接。
HTTP/1.0
就是这样工作的。您可以:

  • 为每个HTTP GET建立不同的连接
  • 对非官方的
    连接使用
    HTTP/1.0
    :保持活动状态
  • 使用
    HTTP/1.1
    。在
    HTTP 1.1
    中,除非另有声明,否则所有连接都被视为持久连接
强制性xkcd链接

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

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

。默认情况下,所有连接都是“持久的”

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

但是,请注意,即使是一些其他方面兼容的HTTP服务器也可能不支持持久连接。此外,请注意,连接实际上可能会在非常小的延迟、一定数量的请求或只是随机的情况下断开。您必须为此做好准备,并准备好重新连接并继续在中断的位置发出请求


另请参阅。

您应该发布相关代码。一段大的文本并不太有用。我理解这一点。但代码太大,我不知道在这里发布代码的哪一部分。我只是想问一下套接字实现。关闭连接是默认行为吗?因为我觉得有点奇怪。我可以接收所有的mes圣人(所有图像)通过同一个套接字。为什么我需要为每个图像再次创建它?学习如何成为一名程序员的一个重要部分是找出如何提取与您的问题相关的代码的基本部分。这也是您找出答案的方式,再加上了解交互的另一面,您可以避免首先要问这个问题。在这种情况下,你应该阅读HTTP规范并思考你的代码是如何实现它的。哦,@cnicutar的答案很可能就是你问题的答案。