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