g87616758 发表于 2015-5-27 12:10:30

MS Proxy FTP Sample

  This sample demonstrates how to use InternetOpenUrl to access FTP server   
through HTTP-Based (i.e. CERN) proxy.
  WinInet uses HTTP protocol to communicate with the proxy, but proxy   
connects to FTP server via FTP protocol. This fact makes impossible to   
use specific WinInet FTP APIs such as FtpOpenFile, FtpPutFile, etc.
  However it is still possible to obtain a directory listing of the FTP server   
and download files using InternetOpenUrl. This protocol independent API   
is capable of taking URL such as ftp://server or http://server.
  Under certain conditions, in addition to FTP server requiring a set of   
credentials (user name and password), proxy server may require a separate set   
of credentials. With InternetOpenUrl user name and password required by the   
FTP server may be include on the URL, like this:
  ftp://User:Pass@ftp.server.com/file.txt
  Please note this syntax is invalid for HTTP and does not allow password   
to include "@" sign. The technique below outlines steps that can be used to   
handle proxy authentication. In other words it explaines how to   
submit second set of credentials for the proxy itself.
  1. Call InternetOpenUrl. If FTP server requires name and password,   
include it in the URL.   
2. Check if handle return by InternetOpenUrl is HTTP type of handle. If   
handle type is HTTP, it indicates that WinInet is communicating with HTTP   
type proxy.   
3. Check for the HTTP status code. If status code indicates that proxy   
authentication is required, acquire user credentials.   
4. User name and password may be acquired with UI by calling InternetErrorDlg   
API or without UI by calling InternetSetOption API.   
5. Once credentials are acquired request must be resubmitted with   
HttpSendRequest API.
  Notes:   
1. Before request is resubmitted all outstanding data must be read with   
InternetReadFile APIs   
2. When InternetReadFile is used to obtain a directory listing   
(ftp://server/MyDir), it may fail with error 122 "Insufficient buffer". In   
this case forth parameter to the APIs (lpNumberOfBytesRead) will be set to   
0 and will NOT indicate the size of the needed buffer. To determine the size   
of the minimal buffer to allocate call InternetQueryDataAvailable API.
  How to run the sample:   
Sample uses INTERNET_OPEN_TYPE_PRECONFIG internet access type. Therefor if   
Internet Explorer is configured to use HTTP proxy, the sample will use the   
same proxy.
  To get myfile.txt and dump to the console by using anonymous FTP connection:   
c:> readurlftp ftp://myserver/myfile.txt con
  The same as above, but save file localy:   
c:> readurlftp ftp://myserver/myfile.txt d:\temp\myfile.txt
  To get directory listing from MyDir and dump to the console by using   
specific user name and password required by FTP server:   
c:> readurlftp ftp://User:Pass@myserver/MyDir con
  The same as above, accept use UI (i.e. bring up dialog box) to enter proxy   
credentials in addition to FTP server credentials:   
c:> readurlftp ftp://myserver/MyDir con -u
  
  
  readurlftp.cpp
  #include   
#include   
#include
  BOOL bUI = FALSE;   
BOOL ErrorOut ( DWORD dError, TCHAR * szCallFunc);   
BOOL GetRemoteFile (HINTERNET IN hOpen, TCHAR * IN szUrl, TCHAR * IN szFileName );
  int main(int argc, char *argv[])   
{
  HINTERNET hOpen;   
    if (argc < 3)   
    {   
      cerr
页: [1]
查看完整版本: MS Proxy FTP Sample