Anuncios Google

[SOLUCIONADO][Lua Dev] No puedo descargar con sockets un archivo grande?

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.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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...

a,b=socket.recv...
while a do
--escribir al archivo...

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.

Imagen de betares

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).

Imagen de betares

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.

Imagen de betares

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!

Imagen de betares

.-. Lol... Lo mejor es un

.-. Lol... Lo mejor es un socket por cada archivo...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.