La breria cURL ci permette di effettuare in modo semplice connessioni HTTP, FTP ed altro da programmi scritti in C. La libreria insieme alla documentazione completa è possibile trovarla sul sito ufficiale: http://curl.haxx.se/. Il modo più semplice per iniziare ad utilizzare la libreria è di usale la cosiddetta "easy interface" un set ridotto di API per un uso semplice e veloce. Tutto l'esempio descritto di seguito fa riferimento a un sistema Linux, sotto Windows possono essere richieste modifiche più o meno grandi a seconda del compilatore e dell'ambiente di sviluppo utilizzato.
Primo passo è di inserire nel sorgente l'opportuno include:
#include
si deve definire un buffer per la ricezione dei dati di ritorno
char buf[1024];
si deve poi inizializzare la libreria con la funzione
CURL *cl = curl_easy_init();
if(!cl) {
cout<<"Fallito l'uso di CURL"<
return 0;
}
Si devono poi impostare le opzioni che descrivono il tipo di trasferimento
Impostiamo l'opzione verbose per avere nello stdout il log di quello che sta facendo la libreria, utile sostanzialmente in fase di debug
curl_easy_setopt(cl, CURLOPT_VERBOSE, 1);
Impostiamo l'url al quale effettuare la connessione
curl_easy_setopt(cl, CURLOPT_URL, "http://192.168.0.10/");
La parte più complessa e come farci restituire il risultato della pagina. Dobbiamo definire una funzione di callback che la libreria chiama quando riceve dei dati di ritorno
curl_easy_setopt(cl, CURLOPT_WRITEFUNCTION, curlwf);
e dobbiamo indicare alla libreria dove posizionare i dati ricevuti in attesa di elaborazione
curl_easy_setopt(cl, CURLOPT_WRITEDATA, buf);
Dopo aver definito tutte le impostazioni si effettua la chiamata voluta
curl_easy_perform(cl);
ed al termine si liberano le risorse allocate chiudendo la connessione
curl_easy_cleanup(cl);
La funzione di callback da passare alla cURL deve seguire il seguente prototipo
size_t curlwf (void *ptr, size_t size, size_t nmemb, void *stream);
i dati ricevuti sono all'indirizzo puntato da *ptr ed hanno una dimensione di size*nmemb; stream contiene il puntatore definito con l'opzione CURLOPT_WRITEDATA (nell'esempio specifico buf). Da notare che i dati ricevuti e posti in *ptr non sono null terminated, se si vogliono utilizzare come stringa è necessario aggiungere lo zero al fondo. Un esempio di funzione di callback può essere il seguente:
size_t curlwf (void *ptr, size_t size, size_t nmemb, void *stream) {
size_t fulllen = size * nmemb;
if (fulllen > 1000) fulllen=1000;
memcpy(stream, ptr, fulllen);
char *x=(char *)stream;
x[fulllen]=0;
return size*nmemb;
}
Infine bisogna ricordarsi di aggiungere per il linking la libreria libcurl (opzione -lcurl del compilatore/linker)
Il sorgente completo del programma di esempio è
#include
size_t curlwf (void *ptr, size_t size, size_t nmemb, void *stream);
int main()
{
char buf[1024];
CURL *cl = curl_easy_init();
if(!cl) {
cout<<"Fallito l'uso di CURL"<
return 0;
}
curl_easy_setopt(cl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(cl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(cl, CURLOPT_URL, "http://10.39.125.75/");
curl_easy_setopt(cl, CURLOPT_WRITEFUNCTION, curlwf);
curl_easy_setopt(cl, CURLOPT_WRITEDATA, buf);
curl_easy_perform(cl);
curl_easy_cleanup(cl);
cout<<
cout << "Finito con CURL!" << endl;
}
size_t curlwf (void *ptr, size_t size, size_t nmemb, void *stream) {
size_t fulllen = size * nmemb;
if (fulllen > 1000) fulllen=1000;
memcpy(stream, ptr, fulllen);
char *x=(char *)stream;
x[fulllen]=0;
return size*nmemb;
}
Nessun commento:
Posta un commento