cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: Downloading files from an FTP server

From: Angus March <angus_at_uducat.com>
Date: Tue, 07 Apr 2009 17:10:01 -0400

I'm starting to wonder if my problem is based on my client running NAT.
I tried changing the line:
            headerlist = curl_slist_append(headerlist, "RETR " + file);
to
            headerlist = curl_slist_append(headerlist, "PASV");
            headerlist = curl_slist_append(headerlist, "RETR " + file);
But now I just get:
227 Entering Passive Mode (67,205,122,7,192,94).
And now it just sits there. How do I deal w/this?

Angus March wrote:
> I'm trying to just download a bunch of files from an ftp server with a
> txt extension, and I'm having a devil of a time figuring out how. I
> think part of my problem is that I need to get a listing of the
> directory, and only then can I download the files. It seems to me that
> libcurl wants to know everything it is doing before it begins the xfer.
> Is that true? Am I going to need to make one connection for listing the
> files and then another for downloading them? That would be a waste.
> The code I have works for the listing, but then when I want to
> download the file I get "425 Unable to build data connection: Invalid
> argument".
>
> CURL *curl;
> CURLcode res;
>
> struct curl_slist *headerlist=NULL;
> static const char list [] = "LIST *.txt";
>
> curl_global_init(CURL_GLOBAL_ALL);
> /* get a curl handle */
> curl = curl_easy_init();
> if(curl) {
> verify(curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION,
> header_callback) == CURLE_OK);
> verify(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
> write_callback) == CURLE_OK);
> verify(curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, list)
> == CURLE_OK);
> verify(curl_easy_setopt(curl, CURLOPT_USERPWD,
> "xxxxxx:xxxxxx") == CURLE_OK);
>
> /* specify target */
> curl_easy_setopt(curl,CURLOPT_URL, "ftp://ftp4.xxxxxx.com/");
>
> /* Now run off and do what you've been told! */
> res = curl_easy_perform(curl);
> g_pLog->LogLine("Res was: " + LtoA(res));
>
> verify(curl_easy_setopt(curl, CURLOPT_WRITEDATA,
> write_data_callback) == CURLE_OK);
> headerlist = curl_slist_append(headerlist, "RETR " +
> file);//this will be a file that was taken out of the listing during the
> previous curl_easy_perform()
> /* pass in that last of FTP commands to run */
> curl_easy_setopt(curl, CURLOPT_QUOTE, headerlist);
> res = curl_easy_perform(curl);
> g_pLog->LogLine("Res was: " + LtoA(res));
>
> /* clean up the FTP commands list */
> curl_slist_free_all (headerlist);
>
> /* always cleanup */
> curl_easy_cleanup(curl);
> }
>
> curl_global_cleanup();
>
>
>
Received on 2009-04-07