电脑软硬件应用网
当前位置: 电脑软硬件应用网 > 设计学院 > 网络编程 > C语言 > 正文
用VC++实现http代理
用VC++实现http代理
2008-8-4 0:44:21  文/佚名   出处:站长网   

  // 准备socket
    HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    if (HTTPSocket==INVALID_SOCKET)
    {
    AfxMessageBox("Error when socket");
    return 0;
    }

    //设置超时
    struct linger zeroLinger;
    zeroLinger.l_onoff = 1;
    zeroLinger.l_linger = 0;
    if(setsockopt(HTTPSocket,SOL_SOCKET,SO_LINGER
    ,(const char *)&zeroLinger
    ,sizeof(zeroLinger))!=0)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("Error when setscokopt(LINGER)");
    return 0;
    }
      //设置接收超时
    if(setsockopt(HTTPSocket,SOL_SOCKET,SO_RCVTIMEO
    ,(const char *)&m_nRecvTimeout
    ,sizeof(m_nRecvTimeout))!=0)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("Error when setsockopt(RCVTIME).");
    return 0;
    }

    //设置发送超时
    if(setsockopt(HTTPSocket,SOL_SOCKET,SO_SNDTIMEO
    ,(const char *)&m_nSendTimeout
    ,sizeof(m_nSendTimeout))!=0)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("Error when setsockopt(SNDTIMEO).");
    return 0;
    }


    SocketAddr.sin_addr.s_addr = htonl (INADDR_ANY);
    SocketAddr.sin_family=AF_INET;

    // 进行端口绑定
    if (bind (HTTPSocket,
    (const struct sockaddr FAR *)&SocketAddr,
    sizeof(SocketAddr))==SOCKET_ERROR)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("Error when bind socket.");
    return 0;
    }

    //准备连接

    /// 准备连接信息
    BindSocket.sin_addr.s_addr = inet_addr (strHost);
    BindSocket.sin_family=AF_INET;
    BindSocket.sin_port=htons(HttpPort);


    struct fd_set fdSet;
    struct timeval tmvTimeout={0L,0L};

    FD_ZERO(&fdSet);
    FD_SET(HTTPSocket, &fdSet);

    if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("Error when select.");
    return 0;
    }

    // 连接


    if (connect(HTTPSocket, (const struct sockaddr *)&BindSocket, sizeof(BindSocket))==SOCKET_ERROR)
    {
    AfxMessageBox("第一次连接失败,准备第二次连接");
    if (connect(HTTPSocket
    ,(const struct sockaddr *)&BindSocket
    ,sizeof(BindSocket))==SOCKET_ERROR)
    {
    closesocket(HTTPSocket);
    AfxMessageBox("连接失败");
    return 0;
    }

    }

    message="连接完成";

    return 1;
    }


      (5)发送http请求,为下载数据进行准备

    int CDLAngelDlg::SendHttpHeader()
    {
    //进行下载

    CString temp;
    BOOL bReturn;
    char tmpBuffer[MAXBLOCKSIZE];
  ///第1行:方法,请求的路径,版本
    temp="GET "+DownLoadAddress+hostFile+" HTTP/1.0\r";
    bReturn=SocketSend(HTTPSocket,temp);
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }


    ///第2行:主机
    temp="Host "+strHost+"\r";
    bReturn=SocketSend(HTTPSocket,temp);
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }


    ///第3行:接收的数据类型
    bReturn=SocketSend(HTTPSocket,"Accept: */*\r");
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }


    ///第4行:
    temp=DownLoadAddress;
    temp.Insert(0,"Referer ");
    temp+="\r";
    bReturn=SocketSend(HTTPSocket,temp);
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }


    ///第5行:浏览器类型

    bReturn=SocketSend(HTTPSocket,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; DTS Agent;)\r");
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }

    ///第6行:连接设置,保持
    // SocketSend(HTTPSocket,"Connection:Keep-Alive\r");

    ///第7行:Cookie.

    bReturn=SocketSend(HTTPSocket,"Cache-Control: no-cache\r");
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }


    bReturn=SocketSend(HTTPSocket,"Proxy-Connection: Keep-Alive\r");
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }

    /// 续传

    Range是要下载的数据范围,对续传很重要
    if(continueFlag)
    {
    temp.Format("Range: bytes=%d- \r",conLength);
    bReturn=SocketSend(HTTPSocket,temp);
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }
    }
///最后一行:空行
    bReturn=SocketSend(HTTPSocket,"\r");
    if(!bReturn)
    {
    message="发送请求失败";
    return 0;
    }

    ///取得http头
    int i;
    i=GetHttpHeader(HTTPSocket,tmpBuffer);
    if(!i)
    {
    message="获取HTTP头出错";
    return 0;
    }

    //如果取得的http头含有404等字样,则表示连接出问题
    temp=tmpBuffer;
    if(temp.Find("404")!=-1)
    {

    return 0;
    }

    // 得到待下载文件的大小

    filelength=GetFileLength(tmpBuffer);

    return 1;
    }


      这样,就连接到网上的另一台机了,如何下载数据,不用多说了吧

    while((num!=SOCKET_ERROR) && (num!=0))
    {
    num=recv (HTTPSocket
    ,(char FAR *)tmpBuffer
    ,(MAXBLOCKSIZE-1)
    ,0);


    file.Write(tmpBuffer,num);

    if(ExitFlag)
    {
    file.Close();
    closesocket(HTTPSocket);

    DownComplete=1;

    m_message.CleanText();
    m_message.ShowColorText(RGB(128,128,0),DLCompleteMes);

    m_progress.ShowWindow(SW_HIDE);
    m_stopDownload.ShowWindow(SW_HIDE);
    _endthread();
    }

    }


      基本就是这样了,本人写程序水平也不是很高,这个程序还是可以用的。

上一页  [1] [2] 

  • 上一篇文章:

  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    用C语言实现的闹钟程序
    C#实现Windows关机的代码
    用动态规划法求组和数的算法
    循环结构程序具有哪3个组成部分?
    const成员函数有什么特点?
    c语言求平均分程序
    一道关于指针的C语言题
    C语言求3个整数的最大公约数
    BM模式匹配算法C语言实现
    从键盘输入任意5个4位整数存入数组a…
    关于45IT | About 45IT | 联系方式 | 版权声明 | 网站导航 |

    Copyright © 2003-2011 45IT. All Rights Reserved 浙ICP备09049068号