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

C 我可以保持与http服务器的连接吗?,c,network-programming,C,Network Programming,现在我有了一个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-&

现在我有了一个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/
所以我想知道,我是否可以只
连接到每个主机一次,然后对每个url只
创建get()
写头()
recv()
?这样可以节省很多时间。所以我改变了我的程序如下:

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
不幸的是,我发现我的程序只能取回每组中的第一个网页,其余的都返回空文件。 我错过什么了吗?可能每个recv()的
sockfd
需要某种
reset


感谢您的慷慨帮助。

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

在我看来,您似乎正在尝试实现自己的HTTP客户端。
我不知道您为什么要这样做,但无论如何,如果您必须这样做,您应该阅读一些关于HTTP RFC的信息,以了解各种头文件,以确保底层TCP连接尽可能长时间地打开


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

您确实使用了头
连接:keep-alive
?但并不是所有的网络服务器都会遵守它,所以当当前连接关闭时,您应该准备打开一个新的连接。我将“连接”设置为“保持活动”,但似乎没有效果。这只是一个练习,我想做一些改进。使用wireshark查看通信流。是否可能是您以某种方式关闭了连接?