FTP gebruiken met een OP CERN gebaseerde proxy met behulp van WinInet-API's

Waarschuwing

De buiten gebruik gestelde, niet meer ondersteunde Internet Explorer 11-desktoptoepassing is permanent uitgeschakeld via een Microsoft Edge-update op bepaalde versies van Windows 10. Raadpleeg Veelgestelde vragen over de beƫindiging van de desktoptoepassing voor Internet Explorer 11 voor meer informatie.

Een webproxyserver op basis van CERN maakt gebruik van HTTP voor alle communicatie met de clients. Daarom kan de FTP-set Wininet-functies niet worden gebruikt om resources te downloaden op een FTP-server als de FTP-server namens de client wordt geopend via een OP CERN gebaseerde proxy. In plaats daarvan moet de client algemene Wininet-functies gebruiken, zoals InternetOpenUrl en InternetReadFile om de gegevens op de juiste manier op te halen uit de HTTP-stroom die is verzonden van de op CERN gebaseerde proxyserver.

Oorspronkelijke productversie: Internet Explorer
Origineel KB-nummer: 166961

Meer informatie

Met CERN compatibele proxyservices ondersteunen HTTP-, FTP- en Gopher-aanvragen. Maar de communicatie tussen de op CERN gebaseerde proxyserver en de bijbehorende clients maakt alleen gebruik van HTTP. In het volgende diagram ziet u hoe een FTP-aanvraag wordt doorgestuurd met behulp van een met CERN compatibele proxyservice:

Get ftp://host.com/root/test.doc HTTP 1.0        FTP Request
   |=========|                 |=============|          |=============|
   |         |---------------->| Cern-based  |--------->|             |
   | Client  |    HTTP         | Proxy Server|   FTP    |  Ftp Server |
   |         |<----------------|             |<---------|             |
   |=========|                 |=============|          |=============|
         HTTP/1.0 200 <document>                  FTP Response

Omdat een op CERN gebaseerde proxyserver communiceert met de clients in HTTP, kunt u de FTP-set wininet-functies niet gebruiken als de client toegang heeft tot de FTP-server via de proxyserver. In plaats daarvan moet u en InternetReadFile gebruiken InternetOpenUrl om de aangevraagde gegevens op te halen uit de HTTP-stroom die is verzonden door de proxyserver.

Als de doorgegeven InternetOpenUrl FTP-URL een URL is naar een bestand op de FTP-server, kunt u gebruiken InternetReadFile om de volledige bestandsinhoud te lezen. Als de DOORgegeven InternetOpenUrl FTP-URL een URL is naar een map op de FTP-server, InternetReadFile wordt een mapvermelding van de FTP-URL opgehaald als een HTML-document. In beide gevallen moet u het aanroepen InternetReadFile mogelijk herhalen totdat alle gegevens in de HTTP-stream zijn gelezen.

Als de client iets verder onder de FTP-map-URL wil ophalen, moet deze het HTML-document parseren om URL's naar submappen of bestanden op te halen en meer InternetOpenUrl en InternetReadFile aanroepen uit te voeren. Ook wanneer een op CERN gebaseerde proxy wordt gebruikt, mag de INTERNET_FLAG_RAW_DATA vlag niet worden opgegeven in de InternetOpenUrl aanroep.

De volgende pseudocode laat zien hoe u aanroept InternetOpenUrl en InternetReadFile wanneer een op CERN gebaseerde proxyserver wordt gebruikt voor toegang tot een FTP-server:

CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
                                0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
    do
        some error processing;
    quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
    do
        some error processing;
    quit;
}

while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
    if (!dwRead)
        break;
    WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.

Wanneer de client een directe verbinding heeft met een FTP-server of is verbonden met de FTP-server via een TIS FTP-proxyserver, verloopt de communicatie van en naar de client in FTP. De client kan de INTERNET_FLAG_RAW_DATA vlag opgeven in InternetOpenUrl en vervolgens gebruiken InternetFindNextFile om een WIN32_FIND_DATA structuur op te halen en alle submappen en bestanden van de URL op te sommen. De client kan in dergelijke situaties ook de FTP-set van Wininet-functies gebruiken.

De volgende pseudocode laat zien hoe u aanroept InternetOpenUrl en InternetReadFile wanneer de INTERNET_FLAG_RAW_DATA vlag is opgegeven in de InternetOpenUrl aanroep:

CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
                                0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
    do
        some error processing;
    quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
    do
        some error processing;
    quit;
}

while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
    if (!dwRead)
        break;
    WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.

Wanneer de verbinding tussen de client en de FTP-server direct is of via een TIS FTP-proxy en InternetOpenUrlInternetReadFile daadwerkelijk FTP-verkeer genereert in plaats van HTTP-verkeer.

De bovenstaande discussie over het gebruik van Wininet-API's met een op CERN gebaseerde proxy is ook van toepassing op GOPHER. Het is ook belangrijk om te weten dat Wininet-API's alleen HTTP-, HTTPS-, FTP- en GOPHER-URL's ondersteunen. Voor BESTANDS-URL's, zoals file://server/share/file of file://\\server\share\file, moet u Win32-API's gebruiken, zoals FileCopy om het bestand te downloaden naar de clientcomputer, of FindFirstFile, FindNextFile en FindClose om een map op te sommen.