Testando internet com lua ūüĆô

80 views
Skip to first unread message

Arion Deno

unread,
May 3, 2023, 10:56:11‚ÄĮAMMay 3
to lua...@googlegroups.com
estou testando conexao com a internet nesse seguinte modo
-------------------------------------------------------------------------
--[[
Testa conexaocom a internet, , retorna true, com exito ou false emerro
]]
function testa_conexao()
--[[
testando conexao com a internet.
se passar da continuidade a execucao
]]
local net = io.popen("ping -c 5 -i 0.5 google.com.br")
local resposta = net:read("*a")
print(resposta)
end
----------------------------------------------------------------------
aparentemente funciona, mas a resposta bem assim:
_________________________________________
Testando conexao com a Internet
PING google.com.br (142.250.219.163) 56(84) bytes of data.
64 bytes from gru06s63-in-f3.1e100.net (142.250.219.163): icmp_seq=1 ttl=59 time=10.7 ms.


Como posso retorno true ou fakse??

Arion Deno

unread,
May 3, 2023, 11:35:00‚ÄĮAMMay 3
to lua...@googlegroups.com
Terei que filtrar a string de saída 

Para obter a resposta?  Correto?

Ou existe uma solução melhor? Ou maís simples?
Obrigado pela ajuda.   

Caso ninguém saiba, não tem problema.   
Eu estou tentando fazer sem socket. Porque será executada num ambiente com suporte basico do sistema 

Gabriel Duarte

unread,
May 3, 2023, 12:03:32‚ÄĮPMMay 3
to lua...@googlegroups.com

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para ver essa discuss√£o na Web, acesse https://groups.google.com/d/msgid/lua-br/CALCf74BN4qyqNuPVqdG-p9yw9oDGuB_kQ2NS-9HgenOysvwh2g%40mail.gmail.com.

IgorFreire

unread,
May 3, 2023, 12:24:49‚ÄĮPMMay 3
to lua...@googlegroups.com
eu trataria a string de resposta..pois quando nao tiver respondendo vai aparecer "esgotado tempo limite"

--

hrcerq

unread,
May 3, 2023, 8:00:22‚ÄĮPMMay 3
to lua...@googlegroups.com
Ol√°.

> Terei que filtrar a string de saída
>
> Para obter a resposta? Correto?
>

Sim, lamentavelmente terá. Você pode realizar uma busca pelo texto
usando string.match, e depois usando a negação. Por exemplo:

local resposta = net:read "a"
local status = not resposta:match "0 received"
-- true = com acesso, false = sem acesso

Note que essa solução é um pouco frágil pois ainda precisaria se
preocupar com as configura√ß√Ķes de idioma onde for executado, e
possíveis mudanças na saída do ping, a depender da versão e
implementação do mesmo.

> Ou existe uma solução melhor? Ou maís simples?

Sem usar socket, as op√ß√Ķes realmente ficam mais limitadas, embora voc√™
possa pensar em outros programas além do ping que facilitem o
tratamento ou o tornem mais robusto. De todo modo, é bom ter em mente
que o io.popen não é uma função portável e algumas plataformas não
suportam.


--
Att,
@hrcerq

0/ ¬ī ¬į ` o ¬ī ¬į ` \0

Arion Deno

unread,
May 9, 2023, 10:40:19‚ÄĮAMMay 9
to lua...@googlegroups.com
Conforme a sugestão de vcs. 

Eu filtrar a string.  
Recebia do ping. 

Eu fiz assim

_---------------------

If( string.find( str, "O% loss") ) then 
  print(" conexão com internet")

end

Caso maus alguém precise,  está aí. 

Obrigado a todos pelas sugest√Ķes.

Agora vou pra parte de express√£o regular.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Rodrigo Régio

unread,
May 9, 2023, 11:29:27‚ÄĮAMMay 9
to lua...@googlegroups.com
Ol√° auro...@gmail.com e a todos,

Quase não comento aqui mas não pude ignorar isto, mas ai diz que se a pessoa tiver 1% de perda ela já não possui conexão com internet, acho que pode ocorrer de perder alguns pacotes e ter conexão (principalmente se dou um ping sem internet e durante habilitar) não sei como você está fazendo, mas se vc deixar o usuário um tempo pingando isto pode ocorrer (de ter uma porcentagem de perdido maior mesmo tendo internet)...

Só quis comentar isto. E acho que o ideal é limitar a somente um ping e verificar se recebeu...

Desculpe qualquer incomodo...

Rodrigo Régio
--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Arion Deno

unread,
May 9, 2023, 11:38:04‚ÄĮAMMay 9
to lua...@googlegroups.com
Claro Rogério, qual seria a melhor forma de fazer. ?




Breno Ramalho Lemes

unread,
May 9, 2023, 9:07:25‚ÄĮPMMay 9
to lua...@googlegroups.com
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
> os.execute('true')
true exit 0
> os.execute('false')
nil exit 1
> os.execute('fping -c 1 -i 1 -q www.google.com.br 2> /dev/null')
true exit 0
> os.execute('fping -c 1 -i 1 -q www.google.com.br 2> /dev/null')
nil exit 2

Esse comando fping é bem mais interessante para usar em scripts, não precisa fazer parse na resposta. Mas isso depende se você pode ou não instalar o fping no sistema. O fping tem cerca de 43 KB e não possui nenhuma dependência (só a libc).

Quanto ao problema de qual o limite de perda de pacotes para considerar sem conexão não tem resposta pronta, você precisa decidir isso. Porque um pacote pode ser bem sucedido, mas ainda assim está sem conexão (como 95% de perda de pacotes, por exemplo). Depende de quanto tempo (quantos pacotes) você quer esperar para ter mais precisão, ou quanta precisão você quer abrir mão para ter uma resposta mais rápida.

No fping voc√™ pode usar o par√Ęmetro -c para dizer quantos pacotes quer testar. E o par√Ęmetro -i o tempo de espera entre um teste e outro (se especificar -c maior que 1). E o par√Ęmetro -t √© o tempo para esperar por cada resposta (timeout).


Arion Deno

unread,
May 10, 2023, 8:59:51‚ÄĮAMMay 10
to lua...@googlegroups.com
Bem realmente, owue vcs falaram tem raz√£o. Ent√£o eu fiz uns testes e debugar ali ou aqui.


Então eu escolhi a palavras.  "packet loss".  Pq quando deixo sem o cabo de rede.  

O ping retorna outra coisa.  

A ideia era só saber se tinha conexão ou não.  Para enviar os dados no servidor.


Mais tarde eu vou testar o framework lápis. 

Obrigado a todos que me responderam 

Denis Dos Santos Silva

unread,
May 13, 2023, 8:41:03‚ÄĮPMMay 13
to Lua BR
fiz um utilitario para simplificar;
apesar de haver diversos programas ping,tracert,... nao eh algo mto simples


tem o fonte, executavel e um exemplo usando io.popen()
retorna a string online/offline
retorna o codigo para usar com cygwin/msys: echo $? ou no windows echo %%errorlevel%%

espero que ajude.

Arion Deno

unread,
May 14, 2023, 4:12:42‚ÄĮPMMay 14
to lua...@googlegroups.com
Muito obrigado Denis. Pela sugestão 



hrcerq

unread,
May 20, 2023, 3:23:38‚ÄĮPMMay 20
to lua...@googlegroups.com
Boa tarde.

> *link do repositorio https://github.com/denisdemaisbr/internet_check*
>
> tem o fonte, executavel e um exemplo usando io.popen()
> retorna a string online/offline

Se me permite, gostaria de adicionar uma sugest√£o em cima dessa ideia.
Mantendo essa premissa de que a m√°quina onde o programa executar√° de
fato esteja rodando Windows, e que enviar um programa escrito em C
pré-compilado seja uma opção viável para o colega, poderíamos no lugar
de criar um programa executável e chamar via io.popen, usar a própria
API C de Lua para criar uma biblioteca compartilhada (uma DLL, no
contexto de Windows).

Ao colocar essa DLL (que no exemplo abaixo estou chamando de vinetlib)
no diretório CPATH (bibliotecas C de Lua) da máquina de destino, o
programa Lua estar√° habilitado a fazer o seguinte:

-- INICIO
vinetlib = require "vinetlib"
print(vinetlib.vinet()) --> true ou false
-- FIM

Ou seja, uma simples função chamada no programa Lua que retorna true
caso conectado e false, caso contrário. O código para gerar essa DLL
pode ser observado a seguir (pegando as ideias do exemplo que
apresentou no repositório do github):

/* INICIO */

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>

#define VC_EXTRALEAN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <wininet.h>

#include "lua.h"
#include "lauxlib.h"

static int vinet(lua_State *L)
{
DWORD flags;
int rc;
BOOL isConnected;

isConnected = InternetGetConnectedState(&flags, 0);
rc = (isConnected) ? 1 : 0;

lua_pushboolean(L, rc);

return 1;
}

static const struct luaL_Reg vinetlib[] = {
{ "vinet", vinet },
{ NULL, NULL }
};

int luaopen_vinetlib(lua_State *L)
{
luaL_newlib(L, vinetlib);
return 1;
}

/* FIM */

Ou seja, basicamente incluí os cabeçalhos lua.h e lauxlib.h de Lua e
substituí a função main pela função vinet (verifica internet), que usa
a pilha virtual para guardar um booleano retornado, e depois cadastrar
essa função vinet usando o registro vinetlib.

A instrução de compilação fica a encargo do usuário, pois dependerá do
compilador que escolher utilizar. Parti da premissa de que a importação
das bibliotecas Lua seriam relativas, mas se possuir Lua no sistema,
poderá fazer absoluto também, fica a critério.

Denis Dos Santos Silva

unread,
May 21, 2023, 7:41:51‚ÄĮAMMay 21
to Lua BR
legal!

tentei fazer da "menor forma possivel" pra funcionar com o io.popen().

vou add uma dll para lua-5.1, 5.2, 5.3, 5.4 (32-bit) para funcionar usando o require() 

o lado bom de colocar como uma dll eh que pode retornar mais informacao



hrcerq

unread,
May 21, 2023, 8:22:39‚ÄĮPMMay 21
to lua...@googlegroups.com
> *legal!*
>

Que bom que gostou da sugest√£o. :)

> tentei fazer da "menor forma possivel" pra funcionar com o io.popen().

Sim. Porém o problema de usar o io.popen() nesse caso é a necessidade
de tratar a saída, além de abrir um novo processo só pra fazer essa
verificação. Fazendo como uma biblioteca, já trata no mesmo processo.

>
> vou add uma dll para lua-5.1, 5.2, 5.3, 5.4 (32-bit) para funcionar usando
> o require()

Só precisa atentar que na versão 5.1 a biblioteca auxiliar não define a
função luaL_newlib [1]. Nesse caso, precisaria usar a luaL_register [2].

> o lado bom de colocar como uma dll eh que pode retornar mais informacao

Ou menos, se for o desejado, trazendo apenas aquilo que é necessário.
Al√©m disso, poder√° depois incluir outras fun√ß√Ķes C para interface com o
sistema operacional, e empacotar tudo numa biblioteca só, no lugar de
criar fun√ß√Ķes espec√≠ficas pra cada coisa e ficar tratando em separado,
e criando um monte de subprocessos desnecess√°rios.

[1] https://www.lua.org/manual/5.2/pt/manual.html#luaL_newlib
[2] https://www.lua.org/manual/5.1/pt/manual.html#luaL_register
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
> Para ver esta discuss√£o na web, acesse https://groups.google.com/d/msgid/lua-br/56db3eda-b00f-4fc4-855f-2db3f68c2d09n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages