Anuncios Google

[Lua] (SOLUCIONADO) Error al abrir archivo descargado mediante sockets

Hola a tod@s.

He estado todo el día intentando correguir un error al descargar un archivo por sockets en LuaDEV, pero me es imposible, nose donde fallo. El problema no esta al descargarlo (Lo descarga correctamente), sino al abrirlo en el ordenador, que me da el siguiente error: Error fatal leyendo el archivo gráfico PNG: IDAT: CRC error.

Este es el script que utilizo:

wlan.init()
conexion = socket.connect("www.google.es", 80)
 
while not conexion:isconnected() do
	screen.print(10, 10, "Conectando...")
	screen.flip()
end
 
conexion:send("GET /images/logo.png HTTP/1.1\r\n")
conexion:send("Host: www.google.es\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()
 
longitud = tonumber(cabecera:match("Content%-Length: (%d+)\r\n"))
archivo = io.open("logo.png", "wb")
 
while longitud > archivo:seek() do
	archivo:write(conexion:recv())
	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()

Es que me di cuenta que el script que puse en el minu-tutorial de sockets tenía un error, y no pasaba de ahí. Por lo que lo hice de 0.


SOLUCIONADO

Nada, ya me estaba desesperando y lo iba a dejar para ponerme a programar NekeOS, y me acordé de que el protocolo HTTP finaliza con una linea vacía. Aquí esta el archivo corregido:

wlan.init()
conexion = socket.connect("www.google.es", 80)
 
while not conexion:isconnected() do
	screen.print(10, 10, "Conectando...")
	screen.flip()
end
 
conexion:send("GET /images/logo.png HTTP/1.1\r\n")
conexion:send("Host: www.google.es\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()
 
longitud = tonumber(cabecera:match("Content%-Length: (%d+)\r\n"))
archivo = io.open("logo.png", "wb")
archivo:write(conexion:recv(longitud))
archivo:close()
 
screen.print(10, 10, "Archivo descargado.")
screen.flip()

LOL... que estupido soy...

 


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).


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.

Pues aunque digas que no, el

Pues aunque digas que no, el problema es la descarga. Tu script está metiendo datos de más al archivo (de dónde? vete a saber =/). Si no lo crees, las últimas 3 líneas de tu script cámbialas por esto:

archivo:flush()
  screen.print(10, 10, "Descargados: "..archivo:seek().."\nTotal: "..longitud)
   screen.flip()
controls.waitforkey()

Imagen de NEKERAFA

Mmm...

Esos datos que mete de demás son los retorno de carro y nueva linea que devuelve el protocolo HTTP al finalizar el envío. A simple vista, los dos pesan lo mismo, pero esos bytes de más están ahí.


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

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.