http - 为什么 recv() 在除第一次以外的所有 for 循环迭代中返回 '0' 字节?

标签 http sockets recv

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

提前致谢。

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

    // 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);
    }

最佳答案

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

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

强制性 xkcd 链接 Server Attention Span

Wiki HTTP

The original version of HTTP (HTTP/1.0) was revised in HTTP/1.1. HTTP/1.0 uses a separate connection to the same server for every request-response transaction, while HTTP/1.1 can reuse a connection multiple times

关于http - 为什么 recv() 在除第一次以外的所有 for 循环迭代中返回 '0' 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6167537/

相关文章:

java - 当条件被 Action 监听器改变时中断 while 循环

java - 由 : java. io.IOException 引起:长度 1279873876 超出限制:26

sockets - ClientAbortException : java.net.SocketException:软件导致连接中止:套接字写入错误

我可以确定在使用 MSG_PEEK 成功调用 recv 后立即执行的 UDP recv 不会阻塞吗?

c++处理irc bot的recv函数中的多个字符串

json - 无法在GO中将JSON作为HTTP POST请求的主体发送总是返回400错误和5035代码?

java - 如何以编程方式配置 Jetty 请求处理程序以处理自定义 HTTP 方法

delphi - TIdHTTPServer 是否与 Microsoft BITS 兼容

http - 如何检查ResponseWriter是否已经写入

c - 套接字编程中从客户端获取char()