Duda acerca libreria Curl C++

WaYnE10

Hola a todos!!!

La duda que tengo es acerca de la libreria curl.h que está disponible para C++

Lo que yo quiero es hacer lo mismo que se puede ejecutar por línea de comando si pones en linux:

curl -o fichero_salida ......

Me gustaría saber cómo puedo usar la opción "-o" con la libreria curl.h.

He buscado por Internet pero no encuentro ninguna manera. Os pongo un ejemplo de programa C++ que usa la libreria curl.h

/*****************************************************************************

  • _ _ ____ _
  • Project ___| | | | _ | |
  • / __| | | | |_) | |
  • | (| || | _ <| |
  • _|_/|| _____|
    *
  • $Id: sepheaders.c,v 1.10 2008-05-22 21:20:09 danf Exp $
    */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}

int main(int argc, char **argv)
{
CURL *curl_handle;
static const char *headerfilename = "head.out";
FILE *headerfile;
static const char *bodyfilename = "body.out";
FILE *bodyfile;

curl_global_init(CURL_GLOBAL_ALL);

/* init the curl session */
curl_handle = curl_easy_init();

/* set URL to get */
curl_easy_setopt(curl_handle, CURLOPT_URL, "URL");

/* no progress meter please */
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

/* send all data to this function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);

/* open the files */
headerfile = fopen(headerfilename,"w");
if (headerfile == NULL) {
curl_easy_cleanup(curl_handle);
return -1;
}
bodyfile = fopen(bodyfilename,"w");
if (bodyfile == NULL) {
curl_easy_cleanup(curl_handle);
return -1;
}

/* we want the headers to this file handle */
curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, headerfile);

/*

  • Notice here that if you want the actual data sent anywhere else but

  • stdout, you should consider using the CURLOPT_WRITEDATA option. */

    /* get it! */
    curl_easy_perform(curl_handle);

    /* close the header file */
    fclose(headerfile);

    /* cleanup curl stuff */
    curl_easy_cleanup(curl_handle);

    return 0;
    }

LOc0
FILE *pfichero=fopen("fichero_salida.txt", "w");

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,  pfichero);

Salu2 ;)

WaYnE10

Gracias, aunque la verdad es que me confundí en el ejemplo jejeje, porque el ejemplo que puse es de recibir por HTTPS información.

Con el comando de "curl -o fichero_salida... " (ahora no sé cual es el comando exacto) pero se puede poner para que envie un fichero por HTTPS y a la vez recibir un fichero de confirmación del buen envio de mi fichero

Lo que yo no sé si poniendo lo que me puso #2 a un código parecido a este (que es el del envio de algo por HTTPS funciona.

(no se si me he explicado bien)

/*****************************************************************************

  • _ _ ____ _
  • Project ___| | | | _ | |
  • / __| | | | |_) | |
  • | (| || | _ <| |
  • _|_/|| _____|
    *
  • $Id: httpput.c,v 1.11 2008-05-22 21:20:09 danf Exp $
    */

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

#include <curl/curl.h>

/*

  • This example shows a HTTP PUT operation. PUTs a file given as a command
  • line argument to the URL also given on the command line.
    *
  • This example also uses its own read callback.
    *
  • Here's an article on how to setup a PUT handler for Apache:
  • http://www.apacheweek.com/features/put
    */

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t retcode;

/* in real-world cases, this would probably get this data differently
as this fread() stuff is exactly what the library already would do
by default internally */
retcode = fread(ptr, size, nmemb, stream);

fprintf(stderr, "*** We read %d bytes from file\n", retcode);

return retcode;
}

int main(int argc, char **argv)
{
CURL *curl;
CURLcode res;
FILE * hd_src ;
int hd ;
struct stat file_info;

char *file;
char *url;

if(argc < 3)
return 1;

file= argv[1];
url = argv[2];

/* get the file size of the local file */
hd = open(file, O_RDONLY) ;
fstat(hd, &file_info);
close(hd) ;

/* get a FILE * of the same file, could also be made with
fdopen() from the previous descriptor, but hey this is just
an example! */
hd_src = fopen(file, "rb");

/* In windows, this will init the winsock stuff */
curl_global_init(CURL_GLOBAL_ALL);

/* get a curl handle /
curl = curl_easy_init();
if(curl) {
/
we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

/* enable uploading */ 
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
 
/* HTTP PUT please */ 
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
 
/* specify target URL, and note that this URL should include a file
   name, not only a directory */ 
curl_easy_setopt(curl, CURLOPT_URL, url);
 
/* now specify which file to upload */ 
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
 
/* provide the size of the upload, we specicially typecast the value
   to curl_off_t since we must be sure to use the correct data size */ 
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
                 (curl_off_t)file_info.st_size);
 
/* Now run off and do what you've been told! */ 
res = curl_easy_perform(curl);
 
/* always cleanup */ 
curl_easy_cleanup(curl);

}
fclose(hd_src); /* close the local file */

curl_global_cleanup();
return 0;
}

LOc0

Pero haz alguna pruebecilla tío. En este mundillo le pese a quien le pese a veces no queda más remedio que ensayo/error.

/*****************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * $Id: simple.c,v 1.6 2004/08/23 14:22:52 bagder Exp $
 */

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;
  FILE *pf=fopen("aver.html", "w+");
  
curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_WRITEDATA, pf); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); }
fclose(pf); return 0; }

Probado en windows 7 con Mingw y funciona.

Salu2 ;)

LzO

[ code ] [ /code ]

de nada

WaYnE10

Gracias!!

Anonimus

aprovecho este hilo para preguntar una casilla:

Empecé ayer a ver como era esto de programar ya que siempre he tenido la curiosidad y me gusta bastante, veremos a ver cuanto duro, el caso es que me he bajado el compilador Dev-C++ 4.9.9.2
y cuando hago el programa mas básico que he encontrado en un manual hace el amago de que arranca pero desaparece, el código es este:

#include <stdio.h>

int main()
{
printf( "Cadena\n" );
printf( "Segunda" );

return 0;
}

dagavi

No hace el amago de arrancar y después desaparece, el programa se inicia, se ejecuta entero y acaba.

Windows cuando un programa acaba te cierra la ventana de la consola si se ha abierto solo para ejecutar el programa (por ejemplo con el doble click).

Solución:
· Ejecutar el programa abriendo tu la ventana (inicio -> ejecutar -> cmd y con la consola ejecutar el programa)
· Hacer que el programa no acabe:

- Versión ultra mega guarra: Bucle infinito al final (for(;; ) ) // El compilador puede hacerlo desaparecer!
- Versión guarra pero menos que la anterior: al final del programa leer de teclado.
- Versión típica windowsera: agregar system("pause" ); al final
Anonimus

Mira pongo esto:
#include <stdio.h>

int main()
{

printf("Hola, mundo");
system("pause");


return 0;
}

y me da este error:
6 C:\Dev-Cpp\Untitled1.cpp `system' undeclared (first use this function)

dagavi

Es normal, estás escribiendo código C pero lo guardas como C++ y por lo tanto se intenta compilar como C++.

El compilador de C++ debería ser con C, pero se queja por los includes.

Solución (a elegir):
· Cambia la extensión del archivo a ".c"
· Haz el programa en C++ con sus includes más correctos y usando las cosas de c++:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hola, mundo" << endl;
    system("pause");
} 

· Agrega #include <windows.h>
a tu programa.

Anonimus

ya he probado y nada me pone: Source file not compiled.

  • He guardado como .c , Despues le e dado a compilar y parece que todo iba bien pero al darle a que se ejecutase me salta ese error.
dagavi

A ver, coge este código y crea un nuevo archivo:

Abre Dev-C++ y pulsas "Control+N" (o en su defecto: archivo -> nuevo -> código fuente)

Copias y pegas este código:

#include <stdio.h>
#include <windows.h>

int main() {
    printf("Hola mundo\n");
    system("pause");
}

Y pulsas "F9".
Te dirá de guardarlo, le pones como nombre "prog.c" mismo y a ver que pasa.

Es que lo acabo de hacer y funciona xD Además de que ese error parece más del Dev-C++ (no te va a decir tu propio programa que no está compilado xDD)

Anonimus

Nada, pongo screen:

http://img37.imageshack.us/img37/9030/erroror.jpg

dagavi

¿Te bajaste la versión con el compilador? (supongo que si porque antes has dicho que hacía el "amago" de ejecutarse)

La versión con compilador, que está en http://www.bloodshed.net/dev/devcpp.html , es la que pone:
Dev-C++ 5.0 beta 9.2 (4.9.9.2) (9.0 MB) with Mingw/GCC 3.4.2

¿Te crea el ejecutable donde esté el archivo .c? ¿puedes ejecutarlo con doble click?

Pero no se que puede pasar, esto es cosa del Dev-C++ no de programación xD

LOc0

Nas. Creo que system() necesita stdlib.h De todas formas, con getchar() tb puedes hacer la pausa.

#include <stdio.h>

int main()
{
printf("Hola mundo\n");
getchar();

return 0;
}

Salu2 ;)

Usuarios habituales

  • LOc0
  • dagavi
  • Anonimus
  • WaYnE10
  • LzO