libcURL es una librería para hacer más fácil la programación de aplicaciones que tienen que hacer uso de protocolos de red. En esta receta encontrarás una breve introducción a la programación con libcURL con un ejemplo básico.
libcURL permite la programación de aplicaciones que necesitan el uso de protocolos de red para su funcionamiento. La estructura de programación de libcURL puede ser un poco "confusa" al principio pero se puede resumir en lo siguiente:
Para instalar libcurl puedes utilizar lo siguiente:
# aptitude install libcurl4-dev
A continuación, se presenta un ejemplo que realiza un HTTP GET escrito en C++:
#include < curl/curl.h >
#include < iostream >
using namespace std;
int main(int argc, char* argv[])
{
curl_global_init(CURL_GLOBAL_ALL);
//Lo primero es crear un contexto.
CURL* contexto = curl_easy_init();
if( contexto == NULL ){
cerr << "Unable to initialize cURL interface" << endl ;
return 1;
}
/*El contexto creado debe ser configurado antes de lanzarse
a su ejecucion. Para ello, se utiliza curl_easy_setopt*/
//La url objetivo
curl_easy_setopt(contexto, CURLOPT_URL, argv[1]);
//Si barra de progreso
//Los valores son TRUE=1 o FALSE=1
curl_easy_setopt(contexto, CURLOPT_NOPROGRESS, 1);
//WRITEHEADER necesita de un FILE* para escribir la cabecera
//WRITE=recibir datos READ=mandar datos
curl_easy_setopt(contexto, CURLOPT_WRITEHEADER, stderr);
//Igual, pero para el contenido real de la respuesta
curl_easy_setopt(contexto, CURLOPT_WRITEDATA, stdout);
/*Fin de configuración. Ahora acción!.*/
const CURLcode rc = curl_easy_perform(contexto);
if(CURLE_OK != rc){
cerr << "Error from cURL: " << curl_easy_strerror(rc) << endl;
}else{
// Estudiar algunos parómetros de la respuesta
cout << "\n\n **STATS** \n\n" << endl;
double valorDouble ;
long valorLong ;
char* valorChar = NULL ;
if( CURLE_OK == curl_easy_getinfo( contexto , CURLINFO_HTTP_CODE , &valorLong ) ){
cout << "Codigo de Respuesta: " << valorLong << endl ;
}
if( CURLE_OK == curl_easy_getinfo( contexto , CURLINFO_CONTENT_TYPE , &valorChar ) ){
cout << "Tipo de Contenido: " << valorChar << endl ;
}
if( CURLE_OK == curl_easy_getinfo( contexto , CURLINFO_SIZE_DOWNLOAD , &valorDouble ) ){
cout << "Bytes Descargados: " << valorDouble << "bytes" << endl ;
}
if( CURLE_OK == curl_easy_getinfo( contexto , CURLINFO_SPEED_DOWNLOAD , &valorDouble ) ){
cout << "Velocidad de Descarga: " << valorDouble << "bytes/sec" << endl ;
}
}
//Limpiar contexto y el sistema de libcurl
curl_easy_cleanup( contexto ) ;
curl_global_cleanup() ;
return( 0 ) ;
}