Ricavare IP Pubblico



Livello: Principiante/Intermedio


Introduzione:

In questo esempio vedremo come sia possibile ricavare il proprio indirizzo ip pubblico attraverso l'ausilio di siti esterni. I siti utilizzati per lo scopo sono: What Is My IP Address - Shows Your IP Address e Current IP Check


Namespaces:

Per l'utilizzo del codice sono richiesti i seguenti Namespaces:
Imports System.Net
Imports System.Text.RegularExpressions

Codice

Il codice è composto da 2 funzioni: nel caso in cui la prima funzione non riesca a ricavare l'ip dal primo sito, verrà richiamata la seconda che proverà sul sito alternativo.

Vediamo la funzione principale:

Public Function GetExternalIp() As IPAddress
 Dim MyExternalIp As IPAddress
 Try
    '-- creo la richiesta
    Dim Request As HttpWebRequest = CType(WebRequest.Create("http://whatismyip.com/automation/n09230945.asp"), HttpWebRequest)
    '-- imposto un timeout di 5 secondi
    Request.Timeout = 5000
    '-- ricevo la risposta
    Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    Dim responseStream As IO.StreamReader = New IO.StreamReader(Response.GetResponseStream, System.Text.Encoding.GetEncoding("iso-8859-1"))
    Dim Result As String = responseStream.ReadToEnd
    responseStream.Close()
    Response.Close()
    '-- creo l'ip dai dati ricevuti
    Try
       MyExternalIp = IPAddress.Parse(Result)
       '-- se non ricevo l'ip
       '-- provo a ricavare l'ip da un sito alternativo
    Catch e As ArgumentNullException
       MyExternalIp = GetExternalIpAlternative()
    Catch e As FormatException
       MyExternalIp = GetExternalIpAlternative()
    End Try
    '-- ritorno l'ip
    Return MyExternalIp
 Catch ex As WebException
    '-- se ricevo errori nella connessione al sito
    '-- provo a ricavare l'ip da un sito alternativo
    Return GetExternalIpAlternative()
 End Try
End Function

Niente di particolare, sono state utilizzate le Classi HttpWebRequest e HttpWebResponse per connettersi al primo sito e ricevere la risposta; Nel caso di esito positivo verrà ritornato l'IPADDRESS convertito dalla risposta, altrimenti verrà richiamata la seconda funzione alternativa.

Vediamo la Funzione Alternativa:

Private Function GetExternalIpAlternative() As IPAddress
 Dim MyExternalIp As IPAddress
 Try
    '-- creo la richiesta
    Dim Request As HttpWebRequest = CType(WebRequest.Create("http://checkip.dyndns.com"), HttpWebRequest)
    '-- imposto un timeout di 5 secondi
    Request.Timeout = 5000
    '-- ricevo la risposta
    Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    Dim responseStream As IO.StreamReader = New IO.StreamReader(Response.GetResponseStream, System.Text.Encoding.GetEncoding("iso-8859-1"))
    '-- estrapolo l'ip con l'aiuto di una Regex
    Dim Result As String = Regex.Match(responseStream.ReadToEnd, "(?<ip>\d+\.\d+\.\d+\.\d+)").Groups("ip").Value
    responseStream.Close()
    Response.Close()
    '-- creo l'ip dai dati ricevuti
    Try
       MyExternalIp = IPAddress.Parse(Result)
       '-- se non ricevo l'ip
       '-- ritorno valore nullo
    Catch e As ArgumentNullException
       Return Nothing
    Catch e As FormatException
       Return Nothing
    End Try
    '-- ritorno l'ip
    Return MyExternalIp
 Catch ex As WebException
    '-- se ricevo errori nella connessione al sito
    '-- ritorno valore nullo
    Return Nothing
 End Try
End Function

Anche qui sono state utilizzate le Classi HttpWebRequest e HttpWebResponse ma in aggiunta è stata inserita una Regex per estrapolare in modo corretto i dati che ci interessano (ovvero l'IP in formato String).


Il pattern utilizzato: "(?<ip>\d+\.\d+\.\d+\.\d+)" effettua le seguenti operazioni:
  • Crea un gruppo, denominato ip, attraverso l'uso del costrutto di raggruppamento (?<name> ...... )
  • All'interno di questo gruppo salva la corrispondenza dell'espressione: \d+\.\d+\.\d+\.\d+
I raggruppamenti ci permettono di richiamare in maniera più chiara le porzioni di stringa che vogliamo estrapolare nel caso in cui volessimo estrapolare più informazioni, io sono abituato ad utilizzarli anche per singoli valori, mi rendono più leggibile quello che sto facendo.


Vediamo come richiamare la funzione per ottenere l'IP (magari nell'evento Click di un Button):

Dim MyExternalIp As IPAddress = GetExternalIp()
If MyExternalIp IsNot Nothing Then
 MessageBox.Show(MyExternalIp.ToString)
Else
 MessageBox.Show("Impossibile ricavare Ip Pubblico", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error)
End If


Alla prossima.