代理上网相关代码收藏

来源:互联网 发布:韩国女主播直播软件 编辑:程序博客网 时间:2024/05/31 04:03
#include   "stdafx.h"    #include   "HttpDownload.h"          #ifdef   _DEBUG    #undef   THIS_FILE    static   char   THIS_FILE[]=__FILE__;    #define   new   DEBUG_NEW    #endif       //////////////////////////////////////////////////////////////////////    //   Construction/Destruction    //////////////////////////////////////////////////////////////////////       HttpDownload::HttpDownload()    {    m_isSendMsg=FALSE;       }       HttpDownload::~HttpDownload()    {       }       UINT   HttpDownload::Download(CString   url,CString   saveFile,DWORD   fileSize,BOOL   isForceGetFileLength,BOOL   isForceDown)    {    CHAR   szHead[]="Accept:   */*/r/n/r/n";            VOID*   szTemp[16384];    HINTERNET     downFileHandle;            DWORD   dwByteToRead   =   0;    DWORD   dwSizeOfRq   =   4;    CFile   downFile;    DWORD   dwSize=0;    DWORD   downTotal=0;    CString   tempFileName;            if(m_hSession!=NULL)    {    if(!(downFileHandle=InternetOpenUrl(m_hSession,   url,   szHead,lstrlenA(szHead),   INTERNET_FLAG_RELOAD,0)))    {    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_OPENFILEERROR;    }    if(isForceGetFileLength)    {    if(!HttpQueryInfo(downFileHandle,   HTTP_QUERY_CONTENT_LENGTH   |   HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwByteToRead,   &dwSizeOfRq,   NULL))    {    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_GETFILELENGTHERROR;    }    }else    dwByteToRead=fileSize;    if(!isForceDown)    {    CFileFind   findDownload;    if(findDownload.FindFile(saveFile))    {       findDownload.FindNextFile();    DWORD   fileLength=findDownload.GetLength();    findDownload.Close();    if(fileLength==dwByteToRead)    {       InternetCloseHandle(downFileHandle);    if(m_isSendMsg)    ::PostMessage(m_hwnd,IOM_DOWNLOAD,0,fileLength);    return   HTTPDOWN_DOWNLOADSUCCESS;    }    else    {    tempFileName=saveFile+".down";    if(!downFile.Open(tempFileName,CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite))    {    downFile.Close();    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_DOWNLOADCREATEFILEERROR;    }    }       }else    {    findDownload.Close();    tempFileName=saveFile+".down";    if(!findDownload.FindFile(tempFileName))    {    findDownload.Close();    if(!downFile.Open(tempFileName,CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite))    {    downFile.Close();    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_DOWNLOADCREATEFILEERROR;    }    }else    {    findDownload.Close();    if(!downFile.Open(tempFileName,CFile::modeWrite|CFile::shareDenyWrite))    {    downFile.Close();    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_DOWNLOADCREATEFILEERROR;    }    DWORD   curFileLength=downFile.SeekToEnd();    if(m_isSendMsg)    ::PostMessage(m_hwnd,IOM_DOWNLOAD,0,curFileLength);    if(!InternetSetFilePointer(downFileHandle,curFileLength,NULL,0,0))    {    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_DOWNLOADSETPOINTERROR;      }    }    }       }else    {    tempFileName=saveFile+".down";    DeleteFile(saveFile);    DeleteFile(tempFileName);    if(!downFile.Open(tempFileName,CFile::modeWrite|CFile::shareDenyWrite))    {    downFile.Close();    return   HTTPDOWN_DOWNLOADCREATEFILEERROR;    }    }    do    {          if(!InternetReadFile(downFileHandle,   szTemp,   16384,   &dwSize)   )          {        downFile.Close();          InternetCloseHandle(downFileHandle);        return   HTTPDOWN_DOWNLOADREADDATAERROR;          }          if(!dwSize)        break;              else          {        downTotal+=dwSize;        downFile.Write(szTemp,dwSize);        if(m_isSendMsg)        ::PostMessage(m_hwnd,IOM_DOWNLOAD,0,dwSize);          }    }while(TRUE);    downFile.Close();      CFile::Rename(tempFileName,saveFile);    InternetCloseHandle(downFileHandle);    return   HTTPDOWN_DOWNLOADSUCCESS;    }else    return   HTTPDOWN_DOWNLOADSEESSIONNULL;    }          UINT   HttpDownload::InitHttpSession()    {    DWORD   dwFlags;    InternetGetConnectedState(&dwFlags,   0);    if(!(dwFlags   &   INTERNET_CONNECTION_PROXY))    {    AfxMessageBox("----1----");    m_hSession   =   ::InternetOpen("VISALL_DOWNLOAD",INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,   NULL,   NULL,   0);    }    else    {    AfxMessageBox("----2----");    m_hSession   =   ::InternetOpen("VISALL_DOWNLOAD",INTERNET_OPEN_TYPE_PRECONFIG,   NULL,   NULL,   0);    }    if(m_hSession==NULL)    return   HTTPDOWN_INITSESSIONERROR;    else    return   HTTPDOWN_INITSESSIONSUCCESS;    }       UINT   HttpDownload::UnInitHttpSession()    {    if(m_hSession)    {    if(InternetCloseHandle(m_hSession))    return   HTTPDOWN_UNINITSESSIONSUCCESS;    else    return   HTTPDOWN_UNINITSESSIONERROR;    }else    return   HTTPDOWN_UNINITSESSIONSUCCESS;    }       void   HttpDownload::SetProgressHwnd(HWND   hwnd)    {    m_hwnd=hwnd;    }       void   HttpDownload::SetProgressMsg(BOOL   isSend)    {    m_isSendMsg=isSend;    }       UINT   HttpDownload::SetTimeOut(DWORD   connectTimeOut,DWORD   receiveTimeout,DWORD   sendTimeOut)    {    if(m_hSession)    {    if(!InternetSetOption(m_hSession,   INTERNET_OPTION_CONNECT_TIMEOUT,   &connectTimeOut,   sizeof(DWORD)))    return   HTTPDOWN_SETTIMEOUTERROR;    if(!InternetSetOption(m_hSession,   INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,   &receiveTimeout,   sizeof(DWORD)))    return   HTTPDOWN_SETTIMEOUTERROR;    if(!InternetSetOption(m_hSession,   INTERNET_OPTION_CONTROL_SEND_TIMEOUT,   &sendTimeOut,   sizeof(DWORD)))    return   HTTPDOWN_SETTIMEOUTERROR;    if(!InternetSetOption(m_hSession,   INTERNET_OPTION_DATA_SEND_TIMEOUT,   &sendTimeOut,   sizeof(DWORD)))    return   HTTPDOWN_SETTIMEOUTERROR;    if(!InternetSetOption(m_hSession,   INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,   &receiveTimeout,   sizeof(DWORD)))    return   HTTPDOWN_SETTIMEOUTERROR;    return   HTTPDOWN_SETTIMEOUTSUCCESS;    }else    return   HTTPDOWN_SETTIMEOUTERROR;    }          #if   !defined(AFX_HTTPDOWNLOAD_H__41263D8F_321A_42F0_889F_3ADB44C80EC0__INCLUDED_)    #define   AFX_HTTPDOWNLOAD_H__41263D8F_321A_42F0_889F_3ADB44C80EC0__INCLUDED_       #if   _MSC_VER   >   1000    #pragma   once    #endif   //   _MSC_VER   >   1000       #include   <wininet.h>    #include   <mmsystem.h>       const   UINT   HTTPDOWN_OPENFILEERROR=1;    const   UINT   HTTPDOWN_GETFILELENGTHERROR=2;    const   UINT   HTTPDOWN_INITSESSIONERROR=3;    const   UINT   HTTPDOWN_INITSESSIONSUCCESS=4;    const   UINT   HTTPDOWN_DOWNLOADSUCCESS=5;    const   UINT   HTTPDOWN_DOWNLOADCREATEFILEERROR=6;    const   UINT   HTTPDOWN_DOWNLOADSETPOINTERROR=7;    const   UINT   HTTPDOWN_DOWNLOADREADDATAERROR=8;    const   UINT   HTTPDOWN_UNINITSESSIONERROR=9;    const   UINT   HTTPDOWN_UNINITSESSIONSUCCESS=10;    const   UINT   HTTPDOWN_SETTIMEOUTSUCCESS=11;    const   UINT   HTTPDOWN_SETTIMEOUTERROR=12;    const   UINT   HTTPDOWN_DOWNLOADSEESSIONNULL=13;       class   HttpDownload        {    public:    HttpDownload();    virtual   ~HttpDownload();       //Operator    public:    UINT   Download(CString   url,CString   saveFile,DWORD   fileSize,BOOL   isForceGetFileLength,BOOL   isForceDown);    void   SetProgressHwnd(HWND   hwnd);    void   SetProgressMsg(BOOL   isSend);    UINT   InitHttpSession();    UINT   UnInitHttpSession();    UINT   SetTimeOut(DWORD   connectTimeOut,DWORD   receiveTimeout,DWORD   sendTimeOut);    //Attribtue    private:    HWND   m_hwnd;            BOOL   m_isSendMsg;    HINTERNET   m_hSession;//   会话句柄    #define   IOM_DOWNLOAD   WM_USER   +155    };       #endif   //   !defined(AFX_HTTPDOWNLOAD_H__41263D8F_321A_42F0_889F_3ADB44C80EC0__INCLUDED_)  ================3. 使用代理服务器(1)请将dwAccessType设置成INTERNET_OPEN_TYPE_PROXY(2)设置lpszProxy   (a)代理的格式必须为:[<protocol>=][<scheme>://]<proxy>[:<port>].   (b)其中protocol, scheme://, :port是可选项, 如果忽略这三者, 则它们默认分别为      HTTP, HTTP://, :80. 即默认为HTTP代理.   (c)多个代理必须使用" "(空格)隔开   (d)各种常用代理的使用见如下:      HTTP:      HTTP=HTTP://proxyserver:port      FTP:      FTP:FTP://proxyserver:port      GOPHER      GOPHER=HTTP://proxyserver:port      SOCKS=proxyserver:port      其中前三种都可以在msdn中找到, 但第四种我可是找了N多地方才好不容易找到了. 另外要注意, msdn中明确说明只有安装了IE才能使用SOCKS代理.---------------------------------------------------------------The   following   example   code   shows   how   authentication   could   be   handled   using   InternetSetOption.          HINTERNET   hOpenHandle,     hResourceHandle;    DWORD   dwError,   dwStatus;    DWORD   dwStatusSize   =   sizeof(dwStatus);    char   strUsername[64],   strPassword[64];       hOpenHandle   =   InternetOpen("Example",                                                            INTERNET_OPEN_TYPE_PRECONFIG,                                                            NULL,   NULL,   0);    hConnectHandle   =   InternetConnect(hOpenHandle,                                                                        "www.server.com",                                                                        INTERNET_INVALID_PORT_NUMBER,                                                                        NULL,                                                                      NULL,                                                                        INTERNET_SERVICE_HTTP,                                                                      0,0);       hResourceHandle   =   HttpOpenRequest(hConnectHandle,   "GET",                                                                        "/premium/default.htm",                                                                        NULL,   NULL,   NULL,                                                                          INTERNET_FLAG_KEEP_CONNECTION,                                                                          0);       resend:       HttpSendRequest(hResourceHandle,   NULL,   0,   NULL,   0);       HttpQueryInfo(hResourceHandle,   HTTP_QUERY_FLAG_NUMBER   |                                  HTTP_QUERY_STATUS_CODE,   &dwStatus,   &dwStatusSize,   NULL);       switch   (dwStatus)    {            case   HTTP_STATUS_PROXY_AUTH_REQ:   //   Proxy   Authentication   Required                    //   Insert   code   to   set   strUsername   and   strPassword.                       //   cchUserLength   is   the   length   of   strUsername   and                      //   cchPasswordLength   is   the   length   of   strPassword.                    DWORD   cchUserLength,   cchPasswordLength;                       //   Insert   code   to   safely   determine   cchUserLength   and                    //   cchPasswordLength.   Insert   appropriate   error   handling   code.                    InternetSetOption(hResourceHandle,                                                          INTERNET_OPTION_PROXY_USERNAME,                                                          strUsername,                                                          cchUserLength+1);                       InternetSetOption(hResourceHandle,                                                          INTERNET_OPTION_PROXY_PASSWORD,                                                          strPassword,                                                          cchPasswordLength+1);                    goto   resend;                    break;               case   HTTP_STATUS_DENIED:           //   Server   Authentication   Required.                    //   Insert   code   to   set   strUsername   and   strPassword.                       //   cchUserLength   is   the   length   of   strUsername   and                      //   cchPasswordLength   is   the   length   of   strPassword.                    DWORD   cchUserLength,   cchPasswordLength;                       //   Insert   code   to   safely   determine   cchUserLength   and                      //   cchPasswordLength.   Insert   error   handling   code   as                      //   appropriate.                    InternetSetOption(hResourceHandle,   INTERNET_OPTION_USERNAME,                                                        strUsername,   cchUserLength+1);                    InternetSetOption(hResourceHandle,   INTERNET_OPTION_PASSWORD,                                                        strPassword,   cchPasswordLength+1);                    goto   resend;                    break;    }       //   Insert   code   to   read   the   data   from   the   hResourceHandle    //   at   this   point.       ======================================设置代理服务器的代码:    for   example:          INTERNET_PER_CONN_OPTION_LIST         List;    INTERNET_PER_CONN_OPTION                   Option[1];    unsigned   long                                         nSize   =   sizeof(INTERNET_PER_CONN_OPTION_LIST);       Option[0].dwOption   =   INTERNET_PER_CONN_PROXY_SERVER;    Option[0].Value.pszValue   =   "http://myproxy:8080";       List.dwSize   =   sizeof(INTERNET_PER_CONN_OPTION_LIST);    List.pszConnection   =   NULL;    List.dwOptionCount   =   1;    List.dwOptionError   =   0;    List.pOptions   =   Option;       if(!InternetSetOption(NULL,   INTERNET_OPTION_PER_CONNECTION_OPTION,   &List,   nSize))          printf("InternetQueryOption   failed!   (%d)/n",   GetLastError());    //more   detail:    HOWTO:   Programmatically   Query   and   Set   Proxy   Settings   Under   Internet   Explorer