curl
-
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