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.

Introducción

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:
  • Creación de un contexto: es necesario crear un contexto de libcURL que se utilizará para realizar las operaciones de red que sean necesarias.
  • Configuración del contexto: mediante opciones, se debe configurar el contexto creado.
  • Ejecución del contexto: ejecutar el contexto ya configurado.
  • Tareas posteriores: tras la ejecución del contexto se pueden realizar otras tareas como resultados de la operación realizada, estadísticas de la red...

Obteniendo libcURL

Para instalar libcurl puedes utilizar lo siguiente:
# aptitude install libcurl4-dev

http_get.cc

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 ) ;
}

Referencias



blog comments powered by Disqus