首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以保持与http服务器的连接吗?

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

Stack Overflow用户
提问于 2012-04-21 16:03:52
回答 1查看 96关注 0票数 1

现在我有了一个url列表,我想把所有的网页都要回来。以下是我所做的工作:

代码语言:javascript
复制
 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都在同一主机下,例如:

代码语言:javascript
复制
 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/

所以我想知道,我是否可以只对每个主机执行一次connect操作,然后对每个url只执行creatGET()writeHead()recv()操作?这可能会节省很多时间。所以我像这样修改了我的程序:

代码语言:javascript
复制
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()提供某种reset

谢谢你的慷慨帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-04-21 16:16:48

HTTP 1.1连接是持久的,这意味着在POST/GET - 200 OK序列之后,下一个请求-响应序列可以重用已经建立的TCP连接。

但这不是强制性的。连接可能在任何时候关闭,因此您也应该为此编写代码。

另外,在我看来,您似乎正在尝试实现自己的HTTP客户端。

我不知道您为什么要这样做,但不管怎样,如果您必须这样做,您应该阅读一些关于HTTP RFC的内容,以了解各种报头,以确保底层TCP连接尽可能长时间地打开。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10257325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档