none
Testar conexão com a internet

    Question

  • Boa tarde

    Pessoal estou criando um aplicativo desktop em vb.net com framework 3.5 e preciso criar uma class que faça um teste para saber se a máquina esta com conexão com a internet, caso esteja retorna veradadeiro caso não esteja retorna falso, como faço um teste desses? Na verdade o maior problema não é a class e som o teste da internet, nunca fiz isso pesquisei achei pouca coisa mas não entendi nada se alguém souber me explicar como fazer isso eu fico grato.
    Alexandre
    Tuesday, March 09, 2010 6:15 PM

Answers

  • Alexandre,

    A classe poderia ser da seguinte maneira:

    Public Class Win32Wrapper

        Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, _
                ByVal dwReserved As Int32) As Boolean

        Public Enum ConnectionStateFlags As Int32
            INTERNET_CONNECTION_CONFIGURED = &H40
            INTERNET_CONNECTION_LAN = &H2
            INTERNET_CONNECTION_MODEM = &H1
            INTERNET_CONNECTION_MODEM_BUSY = &H8
            INTERNET_CONNECTION_PROXY = &H4
            INTERNET_CONNECTION_OFFLINE = &H20
            INTERNET_RAS_INSTALLED = &H10
        End Enum

        Public Shared Function GetConnectedState(ByRef flags As Int32) As Boolean

            If InternetGetConnectedState(flags, 0) Then
                Return True
            End If
            Return False

        End Function

    End Class


    Assim é possível utilizar a mesma usando o código abaixo:

    Sub TesteWin32Wrapper()

        Dim flags As Int32

        If Win32Wrapper.GetConnectedState(flags) Then

            If (flags And Win32Wrapper.ConnectionStateFlags.INTERNET_CONNECTION_LAN) Then
                Console.WriteLine("LAN...")
            ElseIf (flags And Win32Wrapper.ConnectionStateFlags.INTERNET_CONNECTION_MODEM) Then
                Console.WriteLine("Modem...")
            Else
                Console.WriteLine("Other...")
            End If

        End If

    End Sub


    Espero ter ajudado.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, March 11, 2010 5:39 PM
  • Alexandre,

    Na verdade minha classe ficou menor porque encapsula somente a função InternetGetConnectedState. Não sabia que você iria utilizar as outras funções.

    Em relação a sua classe, o maior problema que vejo é ter todos os membros públicos.

    Uma classe wrapper é uma classe que encapsula a funcionalidade de uma outra classe ou componente. Nesse sentido, não vejo a necessidade de incluir a sua variável mlCommand na classe, já que essa variável faz parte da sua lógica de apresentação.

    Para resolver o problema da variável existem diversas alternativas e cada uma possui seus prós e contras. Uma maneira é criar uma classe de controle da aplicação que expõe essa variável (a mesma deve ser Shared, ou seja, da classe).

    Peço que se tiver outras dúvidas crie uma nova thread.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, March 11, 2010 10:23 PM

All replies

  • Boa Noite,Alexandre
    Simples.

               HttpWebRequest req;
                HttpWebResponse resp;
                try
                {
                    req = (HttpWebRequest)WebRequest.Create("http://www.google.com");
                    resp = (HttpWebResponse)req.GetResponse();
    
                    if (resp.StatusCode.ToString().Equals("OK"))
                    {
                        MessageBox.Show("Conectado.");
                    }
                    else
                    {
                        MessageBox.Show("Não está conectado.");
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Erro:"ex.message);
                }

    Américo Arvani MCP/MCTS - WEB Se ajudou , marque como resposta.
    Wednesday, March 10, 2010 12:49 AM
  • Alexandre,

    Além da opção do Américo, também é possível utilizar P/Invoke para chamar a função InternetGetConnectedState da API do Windows.

    How to determine the connection state of your local system and how to initiate or end an Internet connection by using Visual Basic .NET or Visual Basic 2005
    http://support.microsoft.com/default.aspx/kb/821770

    How to find out if the computer is connected to Internet ?
    http://www.dotnetspider.com/resources/861-How-find-out-if-e-computer-connected-In.aspx

    InternetGetConnectedState Function (Windows)
    http://msdn.microsoft.com/en-us/library/Aa384702.aspx

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com


    Wednesday, March 10, 2010 3:26 AM
  • Bom dia

    Pessoal valeu pela ajuda

    Usei o link que o Ari C. Raimundo Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuáriopassou e rolo legal, porém agora estou apanhando em outra coisa, estou tentando criar uma class para usar esse código, ou seja o exemplo do link é esse:

    Public Class Form1
        Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, _
    ByVal dwReserved As Int32) As Boolean
    
        Private Declare Function InternetDial Lib "Wininet.dll" (ByVal hwndParent As IntPtr, _
        ByVal lpszConnectoid As String, ByVal dwFlags As Int32, ByRef lpdwConnection As Int32, _
        ByVal dwReserved As Int32) As Int32
    
        Private Declare Function InternetHangUp Lib "Wininet.dll" _
        (ByVal lpdwConnection As Int32, ByVal dwReserved As Int32) As Int32
    
        Private Enum Flags As Integer
            'Local system uses a LAN to connect to the Internet.
            INTERNET_CONNECTION_LAN = &H2
            'Local system uses a modem to connect to the Internet.
            INTERNET_CONNECTION_MODEM = &H1
            'Local system uses a proxy server to connect to the Internet.
            INTERNET_CONNECTION_PROXY = &H4
            'Local system has RAS installed.
            INTERNET_RAS_INSTALLED = &H10
        End Enum
    
        'Declaration Used For InternetDialUp.
        Private Enum DialUpOptions As Integer
            INTERNET_DIAL_UNATTENDED = &H8000
            INTERNET_DIAL_SHOW_OFFLINE = &H4000
            INTERNET_DIAL_FORCE_PROMPT = &H2000
        End Enum
    
        Private Const ERROR_SUCCESS = &H0
        Private Const ERROR_INVALID_PARAMETER = &H87
    
    
        Private mlConnection As Int32
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim lngFlags As Long
    
            If InternetGetConnectedState(lngFlags, 0) Then
                'connected.
                If lngFlags And Flags.INTERNET_CONNECTION_LAN Then
                    'LAN connection.
                    MsgBox("LAN connection.")
                ElseIf lngFlags And Flags.INTERNET_CONNECTION_MODEM Then
                    'Modem connection.
                    MsgBox("Modem connection.")
                ElseIf lngFlags And Flags.INTERNET_CONNECTION_PROXY Then
                    'Proxy connection.
                    MsgBox("Proxy connection.")
                End If
            Else
                'not connected.
                MsgBox("Not connected.")
            End If
        End Sub
        
    Porém eu preciso fazer esse teste em várias partes do meu aplicativo para definir se a conexão esta ou não ativa, no caso

    Então tirando a parte do Button1 eu preciso que o demais fique em uma class que eu chamo sempre que precisar testar. Como eu coloco isso em uma class e como eu chamado a class para testar? Alguém poderia me explicar?
    Grato


    Alexandre
    Thursday, March 11, 2010 2:10 PM
  • Alexandre,

    É só criar uma classe wrapper e adicionar o código na mesma, assim como você adicionou o código na classe Form1. O ideal é encapsular essas funções em métodos estáticos.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com


    Thursday, March 11, 2010 3:35 PM
  • Boa tarde Ari

    Velho desculpa mas não entendi o que vocÊ me passou, estou estudando class e ainda tenho algumas dificuldades, você falou que o ideal seria encapsular como método estático, como eu faria isso? Não entendi, e depois disso como eu chamo no form?
    Alexandre
    Thursday, March 11, 2010 3:38 PM
  • Alexandre,

    A classe poderia ser da seguinte maneira:

    Public Class Win32Wrapper

        Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, _
                ByVal dwReserved As Int32) As Boolean

        Public Enum ConnectionStateFlags As Int32
            INTERNET_CONNECTION_CONFIGURED = &H40
            INTERNET_CONNECTION_LAN = &H2
            INTERNET_CONNECTION_MODEM = &H1
            INTERNET_CONNECTION_MODEM_BUSY = &H8
            INTERNET_CONNECTION_PROXY = &H4
            INTERNET_CONNECTION_OFFLINE = &H20
            INTERNET_RAS_INSTALLED = &H10
        End Enum

        Public Shared Function GetConnectedState(ByRef flags As Int32) As Boolean

            If InternetGetConnectedState(flags, 0) Then
                Return True
            End If
            Return False

        End Function

    End Class


    Assim é possível utilizar a mesma usando o código abaixo:

    Sub TesteWin32Wrapper()

        Dim flags As Int32

        If Win32Wrapper.GetConnectedState(flags) Then

            If (flags And Win32Wrapper.ConnectionStateFlags.INTERNET_CONNECTION_LAN) Then
                Console.WriteLine("LAN...")
            ElseIf (flags And Win32Wrapper.ConnectionStateFlags.INTERNET_CONNECTION_MODEM) Then
                Console.WriteLine("Modem...")
            Else
                Console.WriteLine("Other...")
            End If

        End If

    End Sub


    Espero ter ajudado.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, March 11, 2010 5:39 PM
  • Opa Ari blz

    Então cara eu tinha feito um modelo aqui ficou maior que o seu, estou estudando o seu agora porém da uma olhada no modelo que fiz:
    Esse é a class:
    Public Class TestaConexao
        Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, _
    ByVal dwReserved As Int32) As Boolean
    
        Declare Function InternetDial Lib "Wininet.dll" (ByVal hwndParent As IntPtr, _
        ByVal lpszConnectoid As String, ByVal dwFlags As Int32, ByRef lpdwConnection As Int32, _
        ByVal dwReserved As Int32) As Int32
    
        Declare Function InternetHangUp Lib "Wininet.dll" _
        (ByVal lpdwConnection As Int32, ByVal dwReserved As Int32) As Int32
    
        Public Enum Flags As Integer
            'Local system uses a LAN to connect to the Internet.
            INTERNET_CONNECTION_LAN = &H2
            'Local system uses a modem to connect to the Internet.
            INTERNET_CONNECTION_MODEM = &H1
            'Local system uses a proxy server to connect to the Internet.
            INTERNET_CONNECTION_PROXY = &H4
            'Local system has RAS installed.
            INTERNET_RAS_INSTALLED = &H10
        End Enum
    
        'Declaration Used For InternetDialUp.
        Public Enum DialUpOptions As Integer
            INTERNET_DIAL_UNATTENDED = &H8000
            INTERNET_DIAL_SHOW_OFFLINE = &H4000
            INTERNET_DIAL_FORCE_PROMPT = &H2000
        End Enum
    
        Public Const ERROR_SUCCESS = &H0
        Public Const ERROR_INVALID_PARAMETER = &H87
    
    End Class
    Esse é o form:

    Public Class Form1
        Private mlConnection As Int32
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Dim ExecutaStringSQL As New QuerySQL
    
            'TestaInternet.InternetGetConnectedState()
            Dim lngFlags As Long
    
            If TestaConexao.InternetGetConnectedState(lngFlags, 0) Then
                'connected.
                If lngFlags And TestaConexao.Flags.INTERNET_CONNECTION_LAN Then
                    'LAN connection.
                    MsgBox("LAN connection.")
                ElseIf lngFlags And TestaConexao.Flags.INTERNET_CONNECTION_MODEM Then
                    'Modem connection.
                    MsgBox("Modem connection.")
                ElseIf lngFlags And TestaConexao.Flags.INTERNET_CONNECTION_PROXY Then
                    'Proxy connection.
                    MsgBox("Proxy connection.")
                End If
            Else
                'not connected.
                MsgBox("Not connected.")
            End If
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim DResult As Int32
    
            DResult = TestaConexao.InternetDial(Me.Handle, "My Connection", TestaConexao.DialUpOptions.INTERNET_DIAL_FORCE_PROMPT, mlConnection, 0)
    
            If (DResult = TestaConexao.ERROR_SUCCESS) Then
                MessageBox.Show("Dial Up Successful", "Dial-Up Connection")
            Else
                MessageBox.Show("UnSuccessFull Error Code" & DResult, "Dial-Up Connection")
            End If
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim Result As Int32
    
            If Not (mlConnection = 0) Then
                Result = TestaConexao.InternetHangUp(mlConnection, 0&)
                If Result = 0 Then
                    MessageBox.Show("Hang up successful", "Hang Up Connection")
                Else
                    MessageBox.Show("Hang up NOT successful", "Hang Up Connection")
                End If
            Else
                MessageBox.Show("You must dial a connection first!", "Hang Up Connection")
            End If
        End Sub
    
    
    End Class
    


    O que vocÊ acha, o que poderia ser mudado nessa class para ela melhorar ou ficar mais segura? Tenho uma outra dúvida, no meu form1 tenho essa variável: Private mlConnection As Int32 que eu gostaria que ela fique dentro da class TestaConexao também e depois chamo ela no form como os demais porém não consegui. Como eu faria isso?

    Vou estudar sua class que parece estar bem menor, já adiantando outra dúvida o que seria uma class "wrapper" como vocÊ mensionou?

    Valeu pela atenção

    Alexandre
    Thursday, March 11, 2010 6:02 PM
  • Alexandre,

    Na verdade minha classe ficou menor porque encapsula somente a função InternetGetConnectedState. Não sabia que você iria utilizar as outras funções.

    Em relação a sua classe, o maior problema que vejo é ter todos os membros públicos.

    Uma classe wrapper é uma classe que encapsula a funcionalidade de uma outra classe ou componente. Nesse sentido, não vejo a necessidade de incluir a sua variável mlCommand na classe, já que essa variável faz parte da sua lógica de apresentação.

    Para resolver o problema da variável existem diversas alternativas e cada uma possui seus prós e contras. Uma maneira é criar uma classe de controle da aplicação que expõe essa variável (a mesma deve ser Shared, ou seja, da classe).

    Peço que se tiver outras dúvidas crie uma nova thread.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, March 11, 2010 10:23 PM
  • Valeu pela força cara vou dar continuidade.
    at,
    Alexandre
    Friday, March 12, 2010 12:37 PM
  • Eu costumo utilizar o seguinte trecho de código para esta tarefa:

    using System.Net.NetworkInformation;

    #region Verificar rede local

                Console.WriteLine();
                Console.WriteLine("Há alguma rede disponível? " + (NetworkInterface.GetIsNetworkAvailable() ? "Sim" : "Não"));

                Console.WriteLine("Interface de Loopback: " +
                    NetworkInterface.GetAllNetworkInterfaces()[NetworkInterface.LoopbackInterfaceIndex].Description);
                Console.WriteLine();

                if (NetworkInterface.GetIsNetworkAvailable())
                {
                    NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

                    foreach (NetworkInterface ni in interfaces)
                    {
                        Console.WriteLine("Nome: " + ni.Name);
                        Console.WriteLine("Descrição: " + ni.Description);
                        Console.WriteLine("MAC Adress: " + ni.GetPhysicalAddress());
                        Console.WriteLine("Descrição: " + ni.Description);
                        Console.WriteLine("ID: " + ni.Id);
                        Console.WriteLine("Tipo: " + ni.NetworkInterfaceType);
                        Console.WriteLine("Velocidade: " + ni.Speed);
                        Console.WriteLine("Status: " + ni.OperationalStatus);
                        Console.WriteLine("Bytes enviados: " + ni.GetIPv4Statistics().BytesSent);
                        Console.WriteLine("Bytes recebidos: " + ni.GetIPv4Statistics().BytesReceived);
                        Console.WriteLine();
                    }
                }

                #endregion

    Obviamente que precisa de adaptação para o ambiente, web ou desktop. O Exemplo é Console.

    Espero que seja útil,

    Abraços


    Rodolfo Paoni
    Thursday, May 27, 2010 2:48 PM