curl



  • Hallo,

    mal en frage, wenn ich mit der libcurl einen download mache dann bekomm ich die ausgabe ja in ein terminal.
    wie leite ich die ausgabe aber in eine datei oder sonst wohin um ?

    res = curl_easy_perform(curl);
    

    das ist ja die funktion wo das downloaden und den output übernimmt.

    Und das is die Ausgabe:
    ...
    < 220 Willkommen. FTP Server ready.
    > USER anon
    < 331 Password required for anon
    > PASS anon
    < 230 User anon logged in.
    > PWD
    < 257 "/" is current directory.
    * Entry path is '/'
    > CWD huch
    < 250 CWD command successful
    > EPSV
    * Connect data stream passively
    < 229 Entering Extended Passive Mode (|||41447|)
    ....

    allerdings blick ich grad nicht wie ich die ausgabe umleite.



  • Falsches Forum! ⚠



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Kann mir mal bitte einer sagen was ich da nicht verstehe ?



  • frag in der curl mailing liste oder lies die doku.



  • Ok, hab ich. Wie man den Output jetzt in ein File umleitet is mir klar.

    Aber ich hab nichts gefunden um das ganze in einen string zu schreiben.

    Die Option um es in eine Datei zu schreiben ist die hier:

    curl_easy_setopt(curl, CURLOPT_STDERR, curl_stderr_file);
    

    Da die Funktion aber einen Pointer auf ein FILE Handle erwartet kann ich ihm ja nicht einfach einen Pointer auf ein char übergeben. Hab auch nix passendes in der Doku gefunden. Nur um Fehler auf ein char umzuleiten stand da drin. Aber für den Verbose output leider nicht.

    Weis da jemand was ?



  • CURLOPT_DEBUGFUNCTION



  • Ok, hast du mir zufällig ein Beispiel dafür ?

    Ich muss der Funktion eine Struktur übergeben in der Definiert ist wohin er den Output leiten soll.



  • CURLOPT_DEBUGDATA



  • sollte mir echt ne brille kaufen. tausend dank.



  • So, das läuft jetzt alles ohne Probleme.

    Jetzt wollte ich einen Schritt weitergehen und das ganze in Threads auslagern,
    allerdings stürzt das Prog jetzt immer ab und ich versteh net ganz wieso.
    Ha mich in der Doku mal danach umgesehen und im Beispiel multithread.c nachgeschaut. Steht dort aber fast genauso wie bei mir. Also vlt entdeckt ja jemand den Fehler.

    void b_download_file()
    {
    
          ...............
            pthread_t p1;
    
    	if ( (pthread_create (&p1, NULL, DownloadFunc, (void *) args)) != 0 )
    	{
      		printf("Fehler beim erzeugen des Download-Threads!!\n");
    		return;
    	}
    	else
    	{
    		// Thread in "detached" Status versetzen
    		pthread_detach (p1);
    	}
    
    	return;
    }
    
    void *DownloadFunc(void *arg)
    {
    	input * new_arg = (input *)arg;
    
    	CURL *curl;
    	CURLcode res;
    	struct FtpFile ftpfile;
    	char *pos;
    	int ch = '/';
    	char curl_error_buffer[CURL_ERROR_SIZE];
    
    	//curl_global_init(CURL_GLOBAL_DEFAULT);
    
    	curl = curl_easy_init();
    	if(curl) 
    	{
    		curl_easy_setopt(curl, CURLOPT_URL,new_arg->url);
    
    		pos = strrchr(new_arg->url,ch);
    
    		if ( pos != NULL )
    		{
    			char save_file[maxtextlength] = "";
    			strcpy(save_file,updir);
    			strcat(save_file,pos);
    			ftpfile.filename = save_file;
    			ftpfile.stream = NULL;
    			printf("Starte download von : %s",new_arg->url);
    		}
    		else
    		{
    			printf("Zielname konnte nicht erstellt werden !\n");
    			return NULL;
    		}
    
    		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE);
    
    		/* Define our callback to get called when there's data to be written */
    		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
    		/* Set a pointer to our struct to pass to the callback */
    		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
    
    		/* Switch on full protocol/debug output */
    		curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);
    
    		/* Callback Funktion für den Output */
    		curl_easy_setopt(curl,  CURLOPT_DEBUGFUNCTION, curl_out);
    		/* Strukur übergabe für ouuput */
    		curl_easy_setopt(curl,  CURLOPT_DEBUGDATA, (void *)new_arg);
    		/* Buffer für ErrorNachrichten */
    		curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_error_buffer);
    
    		res = curl_easy_perform(curl);
    
    		/* always cleanup */
    		curl_easy_cleanup(curl);
    
    		if(CURLE_OK != res) 
    		{
    		/* we failed */
    			printf("FTP : ERROR - Download von \"%s\" fehlgeschlagen !!",new_arg->url);
    			printf("FTP : ERROR - Curl ErrorMsg : %s",curl_error_buffer);
    		}
    		else
    		{
    			printf("Download von \"%s\" abgeschlossen",new_arg->url);
    		}
    	}
    
    	if(ftpfile.stream)
    		fclose(ftpfile.stream); /* close the local file */
    
    	//curl_global_cleanup();
    
    	return NULL;
    }
    

    Wenn ich es nicht als Multithread mache, dann läuft es wunderbar.

    Thx



  • Also ich kann keine Fehler entdecken, aber ich kenn mich auch nicht so mit libcurl aus.
    Aber würde mich auch interessieren, für zukünftige Anwendungen.



  • hmm, weis da keiner was dazu ?

    ich versteh nicht wieso das programm sich so verhält.

    das

    //curl_global_init(CURL_GLOBAL_DEFAULT);
    

    hatte ich nur testweise auskommentiert, ist normal nicht auskommentiert.

    um sicher zugehen, dass es nicht an meinen Implementierungen liegt habe ich auch schon

    /* Callback Funktion für den Output */
            curl_easy_setopt(curl,  CURLOPT_DEBUGFUNCTION, curl_out);
            /* Strukur übergabe für ouuput */
            curl_easy_setopt(curl,  CURLOPT_DEBUGDATA, (void *)new_arg);
            /* Buffer für ErrorNachrichten */
            curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_error_buffer);
    

    auskommentiert. brachte nichts, prog stürzt ab. keine compiler fehler !

    in der doku steht dass man das curl handel nicht mit threads teilen darf und für jeden thread ein eigenes
    handle erzeugen muss. was ich ja tue.

    CURL *curl;
    

    wird ja erst in der thread funktion deklariert.

    kann es vielleicht am return code von curl_easy_perform(curl); liegen ?
    verhält sich das in threads anders ?

    os: cygwin
    compiler: gcc
    linker optionen: -llibcurl -lpthread



  • hab noch eine linker option vergessen zu posten.

    -D_REENTRANT

    hab ich auch noch drin, für thread sichere varianten.



  • sorry, ich mein compiler option.



  • Hey Leute, wenn ich zu dumm bin das zu verstehen dann sagt es mir bitte. Lasst mich nicht dumm sterben 🙂


Anmelden zum Antworten