Binding mod_curl [Descarga de ficheros de Internet]

Started by josebita, November 25, 2011, 12:32:52 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

josebita

He creado un pequeño binding para libcurl de forma que la gente que lo desee pueda descargar recursos de Internet desde su código BennuGD.
Ahora mismo la librería es muy limitada y sólo soporta una descarga cada vez pero esa limitación será eliminada.


Aquí podeis ver un pequeño vídeo de un código que se descarga la página principal de BennuGD de internet:
http://www.youtube.com/watch?v=2pm_sPxkqsc
El API es aún muy simple:

       
  • int curl_get(string srcURL, string dstFILE);
    Descarga los datos de scrURL (que debe tener el formato URL apropiado). Soporta descargas a través de muchos tipos de protocolos distintos, incluídos HTTP, HTTPS y FTP.
    dstFILE es la ruta a la que se escribirá el fichero descargado y por tanto debe ser escribible por el usuario que ejecute el código BennuGD.
    La función devuelve 0 pero cuando se soporten descargas simultáneas devolverá el ID de la transferencia al que habrá que refereirse para obtener información acerca de la descarga.
  • int curl_info(int curl_id, int info_type)
    Devuelve información acerca de la transferencia con ID curl_id. El segundo argumento especifica qué clase de información se desea obtener. Ahora mismo se soporta:

            
    • 0: Devuelve 1 si la transferencia aún está en progreso. En otro caso devuelve 0.
    • 1: Devuelve 1 si la transferencia ya terminó. En otro caso devuelve 0.
    • 2: Devuelve 1 si la transferencia ha fallado. En otro caso devuelve 0.
    Ahora mismo la librería ignora el valor del primer argumento pero cuando se soporten múltiples descargas simultáneas, será el que identifique a cuál nos referimos.
[Edito] Actualizaré el API cuando tenga un ratillo, mientras tanto echadle un ojo al ejemplo incluído.

Lista de errores que puede dar curl_perform():
http://code.google.com/p/bennugd-monolithic/source/browse/trunk/3rdparty/curl/include/curl/curl.h#393

Espero que os sea útil. Iré subiendo binarios para más plataformas según los vaya compilando.


[Edito] Evidentemente la idea es que esto vaya -también- dentro de los ports a iOS y Android.

KeoH

Buen comienzo para la libreria xDD Pero la libcurl tiene mas funciones q iras añadiendo? porq con esto no hago yo un World of Warcraft bennusino xD

josebita

Quote from: KeoH on November 25, 2011, 01:18:02 AM
Buen comienzo para la libreria xDD Pero la libcurl tiene mas funciones q iras añadiendo? porq con esto no hago yo un World of Warcraft bennusino xD
¡Excusas!

El binding irá creciendo, pero de momento el primer paso es conseguir las funciones necesarias para poder "saltarse" la limitación de los 20MiB por 3G de Apple.

El verdadero poder de la librería se controla mediante las opciones que se pasan en el paso de configuración, no en el número de funciones. En todo caso se añadirá soporte para otras cosas, como subida de ficheros a internet.

Otra cosa que he hecho en un rato es integrar la librería dentro del proyecto de BennuGD monolítico para iOS, así que debería ser cuestión de un rato tener la librería funcionando, a ver si mañana por la tarde o el finde saco un rato y actualizo los binarios, como prometí.

Una cosa, Splinter: tú para la forma de "mensajería" cliente-servidor que comentabas ¿usas el API curl_easy?.

SplinterGU

#3
joseba, creo que es un error implementar descarga de archivos... lo ideal es implementar mensajes get/post, si en la respuesta de un mensaje get/post queres mandar un archivo o un mensaje, lo haces indistintamente, que el usuario reciba en una string la respuesta y segun lo que quiera hacer lo graba a un file o lo procesa como un mensaje...

si, uso curl_easy_perform, y tambien tengo unos callbacks para la parte ssl.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

decir "error" fue como mucho... es que no me salia la palabra correcta... quise decir que seria mejor implementar metodo get/post y con eso alcanza para lo que quieras.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

pinger

+1 SplinterGU , no es nada seguro implementar lo que decía Erkos, es decir usar ftp para subir las puntuaciones. Supongo que te refieres a eso. Que se implemente ftp para subir bajar ficheros, puede estar bien, quien te dice que no vas a hacer una aplicación en bennu que es un cliente o servidor de ftp?

osk


Erkosone

Madre mía, que velocidad de implementación.
Muchas gracias por la lib.
Haber si la vemos pronto en el binario monolitico de iOS  :)

Erkosone

Tengo una sugerencia algo simple pero puede ser de gran utilidad para los que hacemos juegos en iOS.
- Bueno, igual digo alguna burrada, disculpadme por ello, no soy ningún profesional en el tema, solo aficionado.


El tema es este:
- Crear un proceso en bennu que se mantenga a la espera de una llamada, cuando se produzca la llamada, desde el proceso "que espera la llamada" poder almacenar en una variable string la IP del solicitante.


Los solicitantes son la gente que está jugando a los juegos, el que espera la llamada será un server privado programado en Bennu para registrar el número de partidas que juega la gente, y con la IP "a bote pronto" conocer desde que paises/zonas se está jugando y sacar estadísticas.
Puede sonar un poco ilegal, no se si esto está permitido, pero seguramente lo harán muchos juegos comerciales de PC.


Esto es posible con esta lib de alguna manera?

josebita

Quote from: SplinterGU on November 25, 2011, 06:11:41 AM
decir "error" fue como mucho... es que no me salia la palabra correcta... quise decir que seria mejor implementar metodo get/post y con eso alcanza para lo que quieras.
Quise entender eso :)

Cuando lo hice de la manera en que lo hice estaba pensando en la gente que lo único que quiere hacer es descargar cosas de internet (mapas nuevos, recursos y tal) y creo que así les será más fácil, de todas formas lo que comentas es cierto. Creo que sería bueno tener una función "fácil" de descarga y otra como comentas.

A nivel de implementación, sería una función que devolvería un string -que se actualizaría a través de las rutinas de curl- y el usuario lo iría leyendo desde BennuGD. Algo así estaría bien, ¿no?.
La descarga en sí se controlaría con la misma función que las descargas que están implementadas ahora.


SplinterGU

Quote from: josebita on November 25, 2011, 12:19:07 PM
Quote from: SplinterGU on November 25, 2011, 06:11:41 AM
decir "error" fue como mucho... es que no me salia la palabra correcta... quise decir que seria mejor implementar metodo get/post y con eso alcanza para lo que quieras.
Quise entender eso :)

Cuando lo hice de la manera en que lo hice estaba pensando en la gente que lo único que quiere hacer es descargar cosas de internet (mapas nuevos, recursos y tal) y creo que así les será más fácil, de todas formas lo que comentas es cierto. Creo que sería bueno tener una función "fácil" de descarga y otra como comentas.

A nivel de implementación, sería una función que devolvería un string -que se actualizaría a través de las rutinas de curl- y el usuario lo iría leyendo desde BennuGD. Algo así estaría bien, ¿no?.
La descarga en sí se controlaría con la misma función que las descargas que están implementadas ahora.

a ver... es que no es practico, asi como esta... el pathname+archivo destino (en el caso de descargas) es poco probable que sepas cuales son para casos de actualizacion, esos datos normalmente son datos que se negocian en la comunicacion, donde normalmente se dice la lista de archivos que vas a recibir y/o los que debes borrar... entonces tener una funcion de descarga implementada asi, no tiene sentido...

ademas, sistema de comunicacion implementado por archivo es lo mas primitivo y poco profesional que existe, eso se usa(ba) en aplicaciones donde los programadores no eran capaces de dominar una comunicacion por mensajes... o cuando se queria comunicar un sistema DOS con uno windows o linux... puf, es la cosa mas fea que vi en mi vida...

erkosone, lo que pedis se puede hacer con la libsock, o alguna de esas... no veo por que decis que puede ser ilegal...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

#12
@erkosone: O puedes ir haciendo peticiones al servidor cada cierto tiempo y comprobar qué te va diciendo.
En todo caso, no puedes contar con que en dispositivos móviles desde fuera te vayan a hacer una petición con alguna librería tipo libsock: en general no se podrá. Tienen el firewall puesto a tope por defecto y nada del tráfico externo puede entrar.

SplinterGU

yo habia interpretado que se referia al server... y clientes haciendo llamadas con libsock o tcpsock al server... y de ahi con la conexion establecida si esperar eventos... igual en un dispositivo movil esto solo esta bueno para comms wifi, no creo que le cause gracia a ningun usuario comerle el credito con mensajes.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Lo de ilegal lo decía por que no estaba seguro, en el fondo es una chorrada si.
Ok, pues tomo nota, lo he comentado por que las lib tcp que hay por el foro ninguna está portada a iOS, entonces preguntaba si con la curl se podría hacer algo así.


Y si, poca gracia haría hacer esto por 3G la verdad.


Vale pues si se puede de alguna manera cuando esté la versión de la lib para windows e iOS registrar la IP los los teléfonos o iPod´s  que hagan la petición será genial.