Anuncios Google

Problema con sockets [Luadev]

Hay algún código en Luadev que funcione perfectamente al descargar un archivo mediante sockets??

He probado esto pero no va:

wlan.init()
conexion = socket.connect("1cd.palco.fm", 80)
 
while not conexion:isconnected() do
	screen.print(10, 10, "Conectando...")
	screen.flip()
end
 
conexion:send("GET /6/7/f/e/djhelioarrebenta-gangnam-style-dj-halio-dj-que-arrebenta.mp3 HTTP/1.1\r\n")
conexion:send("Host: 1cd.palco.fm\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"))
 
data=conexion:recv(longitud)
os.sleep(5)
 
 
archivo = io.open("a.mp3", "wb")
archivo:write(data)
archivo:close()
 
screen.print(10, 10, "Archivo descargado.")
screen.flip()

 

Esto me descarga un sonido de 16.9 KB cuando en realidad pesa 416 KB.

Espero que alguien sepa que pasa.

Salu2


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.


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.

Es una pésima idea tratar de

Es una pésima idea tratar de recibir archivos completos de un solo paso (aunque sean sólo unos kbs). Te recomiendo que leas este coment.

Imagen de jorge_97

No ha sido mi idea...

Además te aseguro haber probado ese mismo código y todos los que he podido encontrar en Scenebeta y con todos he obtenido el mismo resultado.

Espero que me puedas ayudar.

Un saludo


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Con el inicio de tu code no

Con el inicio de tu code no veo problemas. En la parte donde lo bajas lo que deberías hacer es:

  • Hacer un recv primario. Entrar a un bucle.
  • Colocar una condición. Si no llegan datos, volver a hacer un recv y aumentar un contador.
  • Cuando lleguen datos, entrar a un bucle. Recibir pocos datos a la vez (1024 0 2048 bytes, por ejemplo) e irlos escribiendo conforme vayan llegando (un write hacia el archivo de destino). Colocar un contador y una condición, por si no llegan datos esperar a que lleguen (toma en cuenta que los datos no siempre llegan como por un tubo, sino que a veces medio se traba la descarga y después continúa).
  • En cualquier caso, si los contadores rebasan un límite deberás reintentar (ve jugando con los límites para conseguir una espera razonable, digamos unos 4 o 5 segundos. NO uses sleep, o podrías perder datos). Si el primer contador falla, algo ha ido mal con las peticiones. Si el segundo falla, una de dos: o se cortó la conexión, o ya terminó de bajarse el archivo (cuando termina, recv devuelve nil)
  • No te olvides de regresar a 0 los contadores una vez que llegan datos.
Imagen de jorge_97

Lo conseguí ;)

Vale ya está, muchísimas gracias por el algoritmo Rober, aquí dejo el fragmento de code para descargar.

archivo = io.open("a.mp3", "a+")
 
function down()
new=conexion:recv(2048)
archivo:write(new)
while true do
	new=conexion:recv(2048)
	--No llegan datos, pero si llegan los almacenamos y entramos al bucle
	if #new==0 then
		--Reintentamos
		new=conexion:recv(2048)
		if #new>0 then
			archivo:write(new)
			contadorA=0
		else
			--Siguen sin llegar datos
			contadorA=contadorA+1
			if contadorA>10 then
				--Demasiado tiempo
				return
			end
		end
	else
		--Bueno sí, llegaron datos, almcenamos y bucle
		archivo:write(new)
		while true do
			--Volvemos a recibir
			new=conexion:recv(2048)
			--Devuelve nil por lo que ya no quedan más datos
			if new==nil then
				return
			else
				--No llegan
				if #new==0 then
					contadorB=contadorB+1
					if contadorB==20 then
						return
					end
				else
					--Llegaron!!!
					archivo:write(new)
					contadorB=0
				end
			end
			screen.print(10,10,archivo:seek("end"))
			screen.flip()
			new=nil
		end
	end
end
end
 
down()
 
 
archivo:close()

Muchas gracias Rober! :D

Te mando 300 bitos

Un saludo


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

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.