我只想在HTTP / 1.1的请求结束时关闭连接

时间:2011-11-09 20:21:10

标签: c++ http

现在我编写了一个C ++程序来获取具有特定URL的每个页面(就像搜索引擎的Spider程序一样),所以将这个:“GET / HTTP/1.1\r\nHost:www.163.com\r\nConnection:close\r\n\r\n”发送给主机,但是当我recv()所有的时候来自主机的包,连接没有立即关闭。那么我现在可以用HTTP / 1.1做什么呢? 当有READ事件时,我使用epoll检查套接字。

void* NetService::epoll_process ( void* arg )
{
    NetService* netservice = ( NetService* ) arg;
    int nfds;
    int sockfd;

    for ( ; ; )
    {
        // return the nums of sockfds which there can be read or write now.
        nfds=epoll_wait ( netservice->epollfd,netservice->events,20,200 );

        //process the active sockfds
        for ( int i=0; i < nfds; ++i )
        {

            if ( netservice->events[i].events&EPOLLIN )
            {
                if ( ( sockfd = netservice->events[i].data.fd ) < 0 )
                    continue;
                netservice->recv_pkg ( sockfd );
            }

        }
        /*there should to check all the sockfds of their timeouts;*/
        if ( nfds == 0 )
        {
            //cout<<"**********time out***********"<<endl;

        }
    } //(for(;;))

    close ( netservice->epollfd );

    return NULL;

}

3 个答案:

答案 0 :(得分:2)

我建议使用现有的HTTP客户端库,例如libcurl。为什么要编写自己的HTTP客户端库代码? (因为 HTTP并不那么简单,即使仅限于GET次请求)

(这是客户端,这是你的一方,谁应该关闭连接)

Curl的网站列出了几个competitors(即替代图书馆)

答案 1 :(得分:0)

什么意味着连接没有立即关闭? recv没有返回0?我认为你的代码有问题,你可以发布代码吗?我已经使用telnet测试了www.163.com,并且连接立即关闭。

答案 2 :(得分:0)

利用Connection: Close标题。