Autor Tema: Saber si existe conexion a internet  (Leído 73 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Saber si existe conexion a internet
« en: Noviembre 18, 2018, 04:37:50 am »
Buenas, tenga esta inquietud. (publique la pregunta en el foro elhacker pq me urge hallar una respuesta, gracias)

Para poder detectar si tengo o no internet uso la libreria Sensapi.dll
Código: Visual Basic
  1. Option Explicit
  2.  
  3. 'Constantes para determinar que tipo de Red estamos conectados
  4. Const NETWORK_ALIVE_AOL = &H4
  5. Const NETWORK_ALIVE_LAN = &H1
  6. Const NETWORK_ALIVE_WAN = &H2
  7.  
  8. Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (ByRef lpdwFlags As Long) As Long
  9.  
  10. Private Sub Timer1_Timer()
  11. Dim Ret As Long
  12.  
  13. 'Si la Api retorna 0 quiere decir que no hay ningun tipo de conexion de Red
  14. If IsNetworkAlive(Ret) = 0 Then
  15.    Label1 = "No hay"
  16. Else
  17.    Label1 = "Si hay"
  18. End If
  19. End Sub
  20.  

Esto lo ejecuto desde una maquina virtual con conexión a internet, el timer esta con intervalo 2000 y realizo las siguientes pruebas las cuales describo paso a paso:

Ejecuto el programa y no lo detengo

Obtengo el mensaje "Si hay":  CORRECTO
Dentro de Windows deshabilito la red y el programa indica "No hay": CORRECTO
Lo vuelvo a habilitar y obtengo un "Si hay": CORRECTO



A la maquina virtual le quito la red y obtengo "No hay":  CORRECTO
Lo vuelvo a activar y obtengo "Si hay":  CORRECTO
En ese momento me voy al router y lo apago y el programa cambia a "No hay".  CORRECTO
Hasta aqui Bingo pero...

Con el router apagado voy al programa y lo detengo, lo vuelvo a ejecutar y obtengo un "Si hay" pero el router está apagado!!!

¿porque sucede esto estimados?

Quedo a la espera de sus comentarios, muchas gracias
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1077
  • Reputación: +147/-8
    • Ver Perfil
Re:Saber si existe conexion a internet
« Respuesta #1 en: Noviembre 18, 2018, 12:16:58 pm »
Hola Yvan segun la MSDN hay que verificar se se produjo un error, a partir de ahi los resultados pueden cambiar.
https://docs.microsoft.com/en-us/windows/desktop/api/sensapi/nf-sensapi-isnetworkalive

Código: Visual Basic
  1. Option Explicit
  2. Private Declare Function GetLastError Lib "kernel32.dll" () As Long
  3. Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (ByRef lpdwFlags As Long) As Long
  4.  
  5. 'Constantes para determinar que tipo de Red estamos conectados
  6. Const NETWORK_ALIVE_AOL = &H4
  7. Const NETWORK_ALIVE_LAN = &H1
  8. Const NETWORK_ALIVE_WAN = &H2
  9.  
  10.  
  11. Private Sub Timer1_Timer()
  12.     Dim Ret As Long
  13.      
  14.     'Si la Api retorna 0 quiere decir que no hay ningun tipo de conexion de Red
  15.    Err.Clear
  16.     If IsNetworkAlive(Ret) = 0 Then
  17.         If GetLastError = 0 Then
  18.             Label1 = "No hay"
  19.         Else
  20.             Label1 = "No hay" 'quizas SI hay!
  21.        End If
  22.     Else
  23.         If GetLastError = 0 Then
  24.             Label1 = "Si hay"
  25.         Else
  26.             Label1 = "No hay" 'quizas SI hay!
  27.        End If
  28.     End If
  29. End Sub

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #2 en: Noviembre 18, 2018, 01:04:37 pm »
Oh, gracias Lea, voy a checar el enlace y hacer la modificación que indicas.

Saludos
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #3 en: Noviembre 18, 2018, 01:14:37 pm »
Asusta el 'quizas SI hay!  jeje

Doc, estoy viendo el tema y parece que no es buena idea que use esa libreria (SENSAPI). Sucede que use esta porque cuando use la wininet.dll y tengo el cable desconectado simplemente la aplicación queda colgada, a reloj encontré una demora de 14 segundos lo cual es inadmisible.
Me recomendaron hacer Ping a una web pero que debo tener cuidado con tener una DDOS o que la empresa ya tenga cerrado el acceso a las webs...

¿Cual seria la forma mas eficiente de saber si hay o no internet? No busco saber el tipo de conexion o como estoy conectado, sino si existe o no internet. ¿que me recomiendas?

Gracias
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1077
  • Reputación: +147/-8
    • Ver Perfil
Re:Saber si existe conexion a internet
« Respuesta #4 en: Noviembre 19, 2018, 10:45:23 am »
Si el tema del cuelgue es un problema, de modo que creo que ni M$ lo pudo solucionar con IE, de todas formas ya hasta aqui no se mas que consejo darte, lo del ping si mal no recuerdo también produce un cuelgue no se cuanto tiempo pero también freeza la app.

PD ya probaste con las apis InternetCheckConnection y InternetGetConnectedState?

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #5 en: Noviembre 19, 2018, 08:08:59 pm »
Si doc, también probé InternetCheckConnection y InternetGetConnectedState? y tuve el mismo tema y con lo del ping también tuve el mismo inconveniente.

Asi que concluyo en que ya no usare un timer que daca 10 segundos pregunte si hay internet pues con eso daba aviso en mi soft.
Ahora cuando se necesite consumir internet lo primero que haré sera mostrar un cuadro informando que estamos checando la conexión a internet, si esta es rápida casi ni se vera, si es lenta al menos el cliente ya se entera que esta pasando.

Otra cosa que se me ocurre hacer es tener otra app como en residente y sea ella la que consulte continuamente si hay o no internet. La vaina es ¿como le aviso a mi programa?

Será posible que ese programita en residente pueda cambiar un label de mi soft? o pasarle algún parámetro a mi soft si es que este se esta ejecutando?

Lo mas fácil que se me ocurre es que mejor el app residente este consultando continuamente y cuando no halla internet cambie en mi BD un flag, ya desde mi BD solo consultaría ese flag y eso haría que nunca me lagee

¿Que opinas?
Muchas gracias.
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1077
  • Reputación: +147/-8
    • Ver Perfil
Re:Saber si existe conexion a internet
« Respuesta #6 en: Noviembre 21, 2018, 12:43:50 am »
Yvan lo del cartel no es mala idea, si hay Internet todo es rápido y ni se nota, el problema es cuando algo esta mal, ahí se pondrá lento, pero bien ya no es problema de tu soft, lo de una segunda app, guardarlo en una bd/archivo es una opcion, también existen formas de crear comunicación entre ejecutables y disparar algo asi como un evento, pero mi pregunta es si es realmente tan necesario esto?, no se con que fines usas Internet si es una conexión a una bd remota y es conectada o desconectada. ahi tendrías que decidir vos si realmente vale la pena un segundo ejecutable.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #7 en: Noviembre 21, 2018, 02:02:45 am »
Antes lo usaba adicionalmente como un aviso (cartelito) donde informaba al cliente desde mi app si tenia o no acceso a internet... hasta que de pronto un par de mis clientes me informaron que cuando no tenían internet el programa se les ponía lentísimo y resulto ser esto. Por lo tanto ya quite esa funcionalidad (cartelito).

Luego, lo que quiero es comprobar para acciones especificas si hay internet o no. Ejemplo:
El usuario quiere comprobar el stock de una tienda externa. Al hacer clic en el botón Consultar internamente lo que hago es usar un webservices y obtener resultados. O si voy a darle clic a Generar Factura electronica de igual manera consumo un ws.

Bien, antes de hacer ese consumo tengo esto:

Código: Visual Basic
  1. If HayInternet Then
  2.    consumir WS
  3.    otro proceso
  4. End if

¿Que sucede si no tengo conexión a internet? Pues que al hacer clic  y entro a la rutina de HayInternet allí se cuelga la app y eso esta feo, bien podría mostrar previamente un mensaje de "espere..." pero igual se me queda paralizado el programa por mas de 10 segundos y eso es lo que quería evitar, ese feo congelamiento.
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1077
  • Reputación: +147/-8
    • Ver Perfil
Re:Saber si existe conexion a internet
« Respuesta #8 en: Noviembre 22, 2018, 12:15:33 am »
y si solamente mostras el mensage de error de la consulta web? osea no counsultes si hay internet solo muestra un mensage si fallo la consulta.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #9 en: Noviembre 22, 2018, 02:18:26 am »
Ok, mañana hare esa prueba, consumiré directamente el ws probando en quitar el internet de varias formas, capturare el error y para dar un mensaje apropiado, aqui es donde probare que tanto se tarda en responder el error, es buena idea, mañana lo pruebo.

Gracias Lea
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2840
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Saber si existe conexion a internet
« Respuesta #10 en: Noviembre 24, 2018, 08:19:27 pm »
y si solamente mostras el mensage de error de la consulta web? osea no counsultes si hay internet solo muestra un mensage si fallo la consulta.

Efectivamente doc, fue mas rapido generar el error de la desconexion al invocar el webservices que consultar por la conexion...





... asi que me toca capturar el error y dar un mensaje humano al usuario. Muchas gracias
Me encuentras en YAcosta.com