Anuncios Google

Problema con sockets (Lua Dev)

socketa = socket.connect("url.com",80)
while not socketa:isconnected() do
screen.print(200,130,"Please, wait")
screen.flip()
end
socketa:send("GET /aUpdate/cvers.txt HTTP/1.1\r\n")
screen.print(200,130,"Enviando petición GET")
screen.flip()
socketa:send("Host url.com\r\n")
screen.print(200,130,"¿Definiendo host?")
screen.flip()
socketa:send("\r\n")
screen.print(200,130,"Enviando salto de linea")
screen.flip()
file = socketa:recv(1024)
os.sleep(3)
Version = file:match("Alpha:(.+)")
Version = tonumber(Version)
if ( Version == cVers ) then
os.message("Congratulations, you have the last version")
elseif ( Version > cVers ) then
mensaje = os.message("Tere is a new version avaliable, Do you want to download it?",1)
	if ( mensaje == 1 ) then
		Obtener = socketa:send("GET /aUpdate/vers.zip HTTP/1.1\r\n\r\n")
			zips = io.open("update.zip","w")
			elzip = socketa:recv()
			zips:write(elzip)
			zips:flush()
			zips:close()			
			zip.extract("update.zip","")
	end
else
screen.print(200,130,"Ups...Algo falló; "..Version.." tú mismo")
screen.flip()
end

Se queda en "Enviando salto de línea"

 

PD:Ya se que no extraigo la información del zip y que la meto con cabezera y todo en el archivo pero sabiendo en que falla lo primero supongo que lo 2º me sale.


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.
Imagen de DeViaNTe

transmisión instantánea.

Mm, quizás se te queda atascado en "Enviando salto de línea", por que envías el salto de linea, y automaticamente, en cero coma, lees 1024 bytes. Es decir, no le das ni siquiera tiempo a que las ondas wi-fi viajen por tu habitación. El sleep va antes del recv(), para dejar tiempo a que envies, y alguien responda.

Igualmente no es una práctica recomendada esto de enviar, esperar y leer. Y si no llega? Y si por cualquier razón tarda más de 3sec? Y si se cae la conexión? Y si se desconecta el wi-fi por que se va la luz?

Es decir, para programar bien, tienes que programar todas las posibilidades. Viendo que tu código es monohilo y no debe continuar hasta que llegue algo o algo muera, te recomiendo que hagas algo así (sí, parece más complicado, pero en resumen, es plantearte unas preguntas antes, y comenzar a escribir ifs y ifs...):


llegabien = false;
esperando = 0;

while true do
     if (socketa and socketa:isconnected()) then
       bla = socketa:recv();
          if (#bla > 0) then
          -- ha llegado algo. (podriamos comprobar ademas si lo que ha llegado es correcto y completo, o falta por llegar algo.
          -- atender llegada correcta.
          llegabien = true;
          break;
          else
          -- aun no ha llegado nada. esperamos.
          os.sleep(0.5);
          esperando = esperando + 0.5;
             if (esperando > 10) then
             -- llevo 10 secs esperando y aquí no ocurre nada...
             -- algo grave pasó, atender aquí.
             llegabien = false;
             break;
             end
       end
    else
       --algo grave pasó, atender aquí.
       llegabien = false;
       break;
    end
end

 

 


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de carlossg

Gracias, lo tomaré en cuenta

Gracias, lo tomaré en cuenta en el futuro

wlan.init()
 
Llega = false
esperado = 0
tiempo = 0
 
 
if wlan.connected() then
socketa = socket.connect("url.com",80)
	if (socketd and socketa:isconnected()) then
		screen.print(200,130,"Please, wait")
		screen.flip()
		socketa:send("GET /aUpdate/cvers.txt HTTP/1.1\r\n")
		screen.print(200,130,"Enviando petición GET")
		screen.flip()
		socketa:send("Host url.com\r\n")
		screen.print(200,130,"¿Definiendo host?")
		screen.flip()
		socketa:send("\r\n")
		screen.print(200,130,"Enviando salto de linea")
		screen.flip()
			while true do
			file = socketa:recv(1024)
				if (#file > 0) then
				Version = file:match("Alpha:(.+)")
				Version = tonumber(Version)
					if Version ~= nil then
						Llega = true 
						if ( Version == cVers ) then
						os.message("Congratulations, you have the last version")
						elseif ( Version > cVers ) then
						mensaje = os.message("Tere is a new version avaliable, Do you want to download it?",1)
							if ( mensaje == 1 ) then
							Obtener = socketa:send("GET /aUpdate/vers.zip HTTP/1.1\r\n\r\n")
							zips = io.open("update.zip","w")
							elzip = socketa:recv()
							zips:write(elzip)
							zips:flush()
							zips:close()			
							zip.extract("update.zip","")
							end
						else
						screen.print(200,130,"Ups...Algo falló; "..Version.." tú mismo")
						screen.flip()
						end
					else
					os.sleep(0.5)
					tiempo = tiempo + 0.5
						if (tiempo > 10) then
						Llega = false
						break
						end
					end
				else
				os.sleep(1)
				esperado = esperado +1
					if esperado == 2 then
					Llega = false
					break
					end
				end
			end
	end
end

Ahora me conecto a mi red, pantalla negra, y se va al XMB.

Imagen de DeViaNTe

hace lo que le has puesto

hace lo que le has puesto ;)

if (socketd and socketa:isconnected()) then
socketd, error tipográfico. querías poner socketa. Al no encontrarlo no entra en el if y termina el código.

Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de carlossg

Es verdad O.O, ahora estoy

Es verdad O.O, ahora estoy con la psp despues pruebo

EDITO:Cambiado y sigue igual

Imagen de DeViaNTe

reinsisto en la conexión

reinsisto en la conexión ultra-rápida. inmediantamente después de conectar, isconnected() será false. no te entra el if, y sale. dale tiempo que conecte...


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de carlossg

pongo while not

pongo
while not socketa:isconnected() do
screen.print(200,130,"Wait")
screen.flip()
end

Todo antes del 2° if(el de si esta conectado) y la psp se pilla.

PD:El host esta online.

Va, eso está bien, pero

Va, eso está bien, pero también dale tiempo después de enviar las peticiones, algo como...

--Peticiones aquí...
data,size = socketa:recv(1024)
  while not data or size==0 do  --Si no llega data, o si llegan 0 bytes...
    screen.print(50,50,"Esperando... =/")
      data,size = socketa:recv(1024)
    screen.flip()
  end
--Resto del code, aquí (teóricamente) ya tendrás la info que necesitas

Puedes meterle un contador ahi, para pararlo si después de un tiempo no llega nada, y poder reenviar la petición o algo así.

Imagen de fran98

Me parece que DeViaNTe se

Me parece que DeViaNTe se refería a esto:

wlan.init()
 
Llega = false
esperado = 0
tiempo = 0
 
 
if wlan.connected() then
	socketa = socket.connect("url.com",80)
	screen.print(200,130,"Please, wait")
	screen.flip()
	socketa:send("GET /aUpdate/cvers.txt HTTP/1.1\r\n")
	screen.print(200,130,"Enviando petición GET")
	screen.flip()
	socketa:send("Host url.com\r\n")
	screen.print(200,130,"¿Definiendo host?")
	screen.flip()
	socketa:send("\r\n")
	screen.print(200,130,"Enviando salto de linea")
	screen.flip()
			while true do
			if (socketd and socketa:isconnected()) then  --Aquí es donde creo que se debe poner
				file = socketa:recv(1024)
				if (#file > 0) then
				Version = file:match("Alpha:(.+)")
				Version = tonumber(Version)
					if Version ~= nil then
						Llega = true 
						if ( Version == cVers ) then
						os.message("Congratulations, you have the last version")
						elseif ( Version > cVers ) then
						mensaje = os.message("Tere is a new version avaliable, Do you want to download it?",1)
							if ( mensaje == 1 ) then
							Obtener = socketa:send("GET /aUpdate/vers.zip HTTP/1.1\r\n\r\n")
							zips = io.open("update.zip","w")
							elzip = socketa:recv()
							zips:write(elzip)
							zips:flush()
							zips:close()			
							zip.extract("update.zip","")
							end
						else
						screen.print(200,130,"Ups...Algo falló; "..Version.." tú mismo")
						screen.flip()
						end
					else
					os.sleep(0.5)
					tiempo = tiempo + 0.5
						if (tiempo > 10) then
						Llega = false
						break
						end
					end
				else
				os.sleep(1)
				esperado = esperado +1
					if esperado == 2 then
					Llega = false
					break
					end
				end
			end
end

Espero que se te haya solucionado, cuéntanos si tampoco va.

Saludos.

EDITO: Me he equivocado, es socketa en vez de socketd (después del while true do , perdón Guiño.


Imagen de carlossg

Mmmm.. Creo que no, porque

Mmmm.. Creo que no, porque ahí no se comprueba si se ha conectado el socket e indemdiatamente pide el archivo.

Imagen de fran98

Puess... En vez de poner

Puess... En vez de poner socketa:isconnected(), pon socketa:isconnected()==true

Ahi si se comprueba si se ha conectado.

De hecho poner if

De hecho poner if socketa:isconnected() ... o if socketa:isconnected()==true ... es exactamente lo mismo ;)

 

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.