Pues el caso es que probé el ejemplo que está en todo scenebeta como test para usar sockets (descarga una imagen de google) y veo que esta la descarga bien. Pero cuando me pongo a descargar un archivo de 5 MB por ejemplo, solo me descarga 19.6KB y no se porqué... He grabado las headers en un archivo de texto y veo que me envia la longitud conrrecta, pero haga lo que haga solo me descarga 16.6Kb, alguien sabe por qué?
Es basicamente este código: http://psp.scenebeta.com/node/90157#comment-763715
Solo que le puse otro archivo.
EDIT: Le he añadido un bucle y ahora descarga más o menos bien, pero el caso es que creo que no lo descarag exactamente bien, pues el archivo, en este caso .mp3, no se olle muy bien...
EDIT 2: SOLUCIONADO:
El code:
wlan.init() conexion = socket.connect("host", 80) while not socket.isconnected(conexion) do screen.print(10, 10, "Conectando...") screen.flip() end conexion:send("GET /file.mp3 HTTP/1.1\r\n") conexion:send("Host: host\r\n") conexion:send("\r\n") screen.print(10, 10, "Cabecera enviada...") screen.flip() cabecera = "" while true do cabecera = cabecera..conexion:recv(1) screen.print(10, 10, "Recibiendo cabecera...\n"..cabecera) screen.flip() if cabecera:find("\r\n\r\n") then break end end screen.print(10, 10, "Cabecera recibida...\n"..cabecera) screen.flip() archivo = io.open("head.txt", "w") archivo:write(cabecera) archivo:close() longitud = tonumber(cabecera:match("Content%-Length: (%d+)\r\n")) archivo = io.open("file.mp3", "wb") while longitud > archivo:seek() do vardata=conexion:recv() archivo:write(vardata) screen.print(10, 10, "Descargando "..files.sizeformat(archivo:seek()).." de "..files.sizeformat(longitud)..". "..(100*tonumber(archivo:seek())/longitud).."%") screen.flip() end archivo:close() screen.print(10, 10, "Archivo descargado.") screen.flip() error("USB encendido", 2)
Las claves eran:
1.- Poner un bucle para descargar los archivos mayores de 20KB
2.- Creo que como la PSP no puede escribir en la memory tan rápido como descarga, he puesto un pequeño buffer de unos 5Kb usando la variable vardata, de forma que se guarda en esa var y luego se escribe, y al no hacerlo todo a la vez, lo hace sin errores.
Muchas gracias a los que hicieron los posts con fragmentos de código y gracias a mi mismo (egocentrico XD) por darme cuenta de que el problema era ese.
Que code estás usando? La
Que code estás usando? La conexión por sockets debe ser cuidadosamente programada, un error común es usar algo como...
Porque de esta manera, si el socket se tarda un poquito en enviar el contenido (ya sea porque la conexión es inestable, o porque estamos recibiendo muy rápido) se corta la conexión.
Ya he puesto el link arriba
Ya he puesto el link arriba
Con ese code nunca lo vas a
Con ese code nunca lo vas a lograr... 5Mb es demasiado para recibirlos todos de golpe (además de que en ese code no revisa si ya se recibieron los bytes pedidos antes de guardar).
Lo que debes hacer es un while tal y como se hace con la cabecera, y recibir poco a poco el archivo (no necesariamente recibir 1 a la vez, puedes usar 1024, 2048... o quizá hasta un número más grande. Experimenta).
buf, muchísimas gracias ^^
buf, muchísimas gracias ^^ He seguido este post: http://psp.scenebeta.com/node/92021 ayudandome del bucle del code del post y de tu respuesta para obtener el tamaño.
Aun así no me lo descarga muy bien, pues me descargo un .mp3 y se olle entrcortado. .-. He leido en ese post que el problema era el \r, como hago para que esto no se descargue? Vi que tienes un proyecto en Lua sobre la scenebta store, podrías llevarme por ahí, si quieres .-.
Pero si te lo descarga
Pero si te lo descarga entero? Porque si no está todo es obvio que va sonar mal.
Ya lo modifiqué en el post,
Ya lo modifiqué en el post, el caso es que la PSP no da escrito y leido por sockets los datos a la vez a semejante velocidad, por lo cual lo único que hace es primero guardarlo en una variable y luego guardarlo en el archivo.
Os comento
Un experimento que realizé, hace algo de tiempo estaba experimentando con Sockets y creé varios sockets hacia un mismo servidor, y con un bucle for, iba descargando los datos, acabó en desastre, parecía que se perdían datos, y no pocos, un archivo de 10Mb llegaron 6.4Mb...
Cuando pueda busco el code y lo posteo.
Salu2!
.-. Lol... Lo mejor es un
.-. Lol... Lo mejor es un socket por cada archivo...