求代码,最好可立即运行.

解决方案 »

  1.   

    方法1:
    直接用socket的API进行下载
    A.先连接上http代理,以下是连接和验证http/socks代理的代码static void to64frombits(unsigned char *out, const unsigned char *in, int inlen) 

    const char base64digits[] = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
    for (; inlen >= 3; inlen -= 3) 

    *out++ = base64digits[in[0] >> 2]; 
    *out++ = base64digits[((in[0] < < 4) & 0x30) | (in[1] >> 4)]; 
    *out++ = base64digits[((in[1] < < 2) & 0x3c) | (in[2] >> 6)]; 
    *out++ = base64digits[in[2] & 0x3f]; 
    in += 3; 

    if (inlen > 0) 

    unsigned char fragment; *out++ = base64digits[in[0] >> 2]; 
    fragment = (in[0] < < 4) & 0x30; 
    if (inlen > 1) 
    fragment |= in[1] >> 4; 
    *out++ = base64digits[fragment]; 
    *out++ = (inlen < 2) ? '=' : base64digits[(in[1] < < 2) & 0x3c]; 
    *out++ = '='; 

    *out = '\0'; 
    }; //-- connect proxy 
    BOOL ConnectEx(SOCKET sock, const char *lpszDestHost, int nDestPort, const char * lpszProxyAddress, const int nProxyPort, const char * lpszProxyProtocol, BOOL bNeedAuth, const char * lpszUserName, const char * lpszPassword) 

    //connect to proxy 
    char szBuffer[1024 + 1] = {""}; 
    int nLen = 0; SOCKADDR_IN saProxy; 
    saProxy.sin_family = AF_INET; 
    saProxy.sin_port = nProxyPort; 
    saProxy.sin_addr.S_un.S_addr= inet_addr(lpszProxyAddress); 
    if (saProxy.sin_addr.S_un.S_addr == INADDR_NONE) 

    LPHOSTENT lphost; 
    lphost = gethostbyname(lpszProxyAddress); 
    if (lphost != NULL) 
    saProxy.sin_addr.S_un.S_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr; 
    else 

    return 0; 

    } if(connect(sock, (SOCKADDR*)&saProxy, sizeof(SOCKADDR))) 

    return 0; 
    } if(stricmp(lpszProxyProtocol, "HTTPS") == 0 || stricmp(lpszProxyProtocol, "HTTP") == 0 ) 

    if(bNeedAuth) 

    //Proxy-Authorization: Basic 
    char szAuth[1024 + 1] = {""}; 
    char szAuthT[1024 + 1] = {""}; 
    sprintf(szAuthT, "%s:%s", lpszUserName,lpszPassword); 
    to64frombits((UCHAR *)szAuth, (UCHAR *)szAuthT, strlen(szAuthT)); 
    sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: Basic %s\r\n\r\n", lpszDestHost, nDestPort, szAuth); 

    else 

    sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\n\r\n", lpszDestHost, nDestPort); 
    } nLen = strlen(szBuffer); 
    send(sock, szBuffer, nLen, 0); 
    nLen = 1024; 
    recv(sock, szBuffer, nLen, 0); 
    if(strnicmp(szBuffer, "HTTP/1.0 200", strlen("HTTP/1.0 200")) == 0 || 
    strnicmp(szBuffer, "HTTP/1.1 200", strlen("HTTP/1.1 200")) == 0) 

    return 1; 

    return 0; 
    } if(stricmp(lpszProxyProtocol, "SOCKS5") == 0) 

    //auth 
    nLen = 0; 
    if(bNeedAuth) 

    szBuffer[0] = 5; 
    szBuffer[1] = 2; 
    szBuffer[2] = 0; 
    szBuffer[3] = 2; 
    nLen = 4; 
    send(sock, szBuffer, nLen, 0); 
    nLen = 2; 
    recv(sock, szBuffer, nLen, 0); 
    if(szBuffer[0] == 5) 

    //need auth 
    if(szBuffer[1] == 2) 

    szBuffer[0] = 1; 
    nLen = strlen(lpszUserName); 
    szBuffer[1] = nLen; 
    strcpy(szBuffer+2, lpszUserName); 
    nLen += 2; 
    szBuffer[nLen] = strlen(lpszPassword); 
    strcpy(szBuffer+nLen+1, lpszPassword); 
    nLen = nLen + 1 + strlen(lpszPassword); 
    send(sock, szBuffer, nLen, 0); 
    nLen = 2; 
    recv(sock, szBuffer, nLen, 0); 
    if(szBuffer[1] != 0) 

    return 0; 


    else 

    if(szBuffer[1] != 0) 

    return 0; 



    else 
    return 0; } 
    else 

    szBuffer[0] = 5; 
    szBuffer[1] = 1; 
    szBuffer[2] = 0; 
    nLen = 3; 
    send(sock, szBuffer, nLen, 0); 
    nLen = 2; 
    recv(sock, szBuffer, nLen, 0); 
    if(szBuffer[0] != 5 || szBuffer[1] != 0) 

    return 0; 


    //translate DestAddr 
    szBuffer[0] = 5; 
    szBuffer[1] = 1; 
    szBuffer[2] = 0; 
    szBuffer[3] = 3;//DOMAIN 
    szBuffer[4] = strlen(lpszDestHost);//domain len 
    strcpy(szBuffer+5, lpszDestHost); 
    unsigned short uPort = htons(nDestPort); 
    memcpy(szBuffer+5+strlen(lpszDestHost), &uPort, 2); 
    nLen = 5 + strlen(lpszDestHost) + 2; 
    send(sock, szBuffer, nLen, 0); 
    nLen = 10; 
    recv(sock, szBuffer, nLen, 0); 
    if(szBuffer[0] != 5 || szBuffer[1] != 0) 

    return 0; 

    return 1; 

    return 0; 
    } B.然后通过代理连上ftp,然后所有步骤你可以看用一般ftp客户端如何验证和下载文件的.上面方法比较繁锁.
      

  2.   

    方法2:
    1.先将代理设置进IE,以下代码设置代理到IE
    BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
    {
        //conn_name: active connection name. 
        //proxy_full_addr : eg "210.78.22.87:8000"
        INTERNET_PER_CONN_OPTION_LIST list;
        BOOL    bReturn;
        DWORD   dwBufSize = sizeof(list);
        // Fill out list struct.
        list.dwSize = sizeof(list);
        // NULL == LAN, otherwise connectoid name.
        list.pszConnection = conn_name;
        // Set three options.
        list.dwOptionCount = 3;
        list.pOptions = new INTERNET_PER_CONN_OPTION[3];
        // Make sure the memory was allocated.
        if(NULL == list.pOptions)
        {
              return FALSE;
        }
        // Set flags.
        list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
        list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
        // Set proxy name.
        list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
        list.pOptions[1].Value.pszValue = proxy_full_addr;
        // Set proxy override.
        list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
        list.pOptions[2].Value.pszValue = "local";
        // Set the options on the connection.
        bReturn = InternetSetOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
        // Free the allocated memory.
        delete [] list.pOptions;
        InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
        InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
        return bReturn;
    }2.InternetOpen("FTP", INTERNET_OPEN_TYPE_PROXY
    ,"TestProxy",NULL, 0);3.InternetConnect(.........)4.InternetReadFile(......)5.WriteFile(.........)这种方法远比第一种方法简单.思路已经给出了,部分代码也有了,自己要写出来,也不是什么难事.
      

  3.   

    楼上的是不是P.S.T.的WinEggDrop阿?