gpt4 book ai didi

我可以保持与 http 服务器的连接吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:10 24 4
gpt4 key购买 nike

现在我有一个 url 列表,我想取回所有网页。这是我所做的:

 for each url:
getaddrinfo(hostname, port, &hints, &res); // DNS
// create socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect(sockfd, res->ai_addr, res->ai_addrlen);
creatGET();
/* for example:
GET / HTTP/1.1\r\n
Host: stackoverflow.cn\r\n
...
*/
writeHead(); // send GET head to host
recv(); // get the webpage content
end

我注意到很多 url 都在同一个主机下,例如:

 http://job.01hr.com/j/f-6164230.html
http://job.01hr.com/j/f-6184336.html
http://www.012yy.com/gangtaiju/32692/
http://www.012yy.com/gangtaiju/35162/

所以我想知道,我是否可以只连接到每个主机一次,然后只creatGET()writeHead()recv() 每个 url?这可能会节省很多时间。所以我改变了我的程序:

split url into groups by their host;
for each group:
get hostname in the group;
getaddrinfo(hostname, port, &hints, &res);
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect(sockfd, res->ai_addr, res->ai_addrlen);
for each url in the group:
creatGET();
writeHead();
recv();
end
end

不幸的是,我发现我的程序只能返回每组中的第一个网页,其余的都返回空文件。我错过了什么吗?也许 sockfd 需要对每个 recv() 进行某种重置

感谢您的慷慨帮助。

最佳答案

HTTP 1.1 连接是持久的,这意味着在例如之后。 POST/GET - 200 OK sequense 下一个请求-响应序列可以重用已经建立的 TCP 连接。
但这不是强制性的。连接可能随时关闭,因此您也应该为此编写代码。

而且在我看来,您正在尝试实现自己的 HTTP 客户端。
我不确定您为什么要这样做,但无论如何,如果您必须阅读一些有关 HTTP RFC 的内容,以了解各种 header ,以确保底层 TCP 连接尽可能长时间打开。

当然,如果您的服务器是旧的 HTTP1.0,您不应该期望任何连接重用,除非通过 keep-alive header 明确指示

关于我可以保持与 http 服务器的连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com