Obtener IP Publica en VB.NET y CSharp

New product

Como saber la IP pública escrita en vb.net y c#. Código fuente disponible.

Obtener IP Publica en VB.NET y C#

Muchas veces nos vemos en la dificultad de saber la IP pública de la maquina en donde corremos nuestro programa o aplicación. Para estos casos la plataforma NET nos brinda herramientas para trabajar con protocolo http y con las mismas poder leer contenido de la WEB.

Asi que en este artículo puse manos a la obra en realizar una clase que me permita conocer la IP de una maquina en donde se ejecute la función. La muestro a continuación:

Creamos una función que lea contenido WEB y la llamo AsyncDarContenidoHtmlWebsite.

En Visual Basic NET seria:

    Public Shared Async Function AsyncDarContenidoHtmlWebsite(ByVal mURL As String,
Optional TiempoEspera As Integer = 5000) As Task(Of String)
Dim PeticionWeb As System.Net.WebRequest
Dim RespuestaWeb As System.Net.HttpWebResponse
Dim datos As String = ""

'Ejecutando la tarea asincrona.
Await Task.Run(Sub()
Try
PeticionWeb = System.Net.WebRequest.Create(mURL)
PeticionWeb.Timeout = TiempoEspera
RespuestaWeb = PeticionWeb.GetResponse()
datos =
New System.IO.StreamReader(RespuestaWeb.GetResponseStream()).ReadToEnd()
Catch ex As System.Net.WebException
'ex.Status .
datos = "Error " & ex.Status.ToString
End Try
End Sub
)
If datos = "" Then
datos = "Error "
End If
Return
datos

End Function

En C# seria:

public static async Task<string> AsyncDarContenidoHtmlWebsite(string mURL, int TiempoEspera = 5000)
{
System.Net.
WebRequest PeticionWeb;
System.Net.
HttpWebResponse RespuestaWeb;
string datos = "";

// Ejecutando la tarea asincrona.
await Task.Run(() =>
{
try
{
PeticionWeb = System.Net.
WebRequest.Create(mURL);
PeticionWeb.Timeout = TiempoEspera;
RespuestaWeb = (
HttpWebResponse)PeticionWeb.GetResponse();
datos =
new System.IO.StreamReader(RespuestaWeb.GetResponseStream()).ReadToEnd();
}
catch (WebException ex)
{
datos =
"Error " + ex.Status.ToString();
}
});
if (datos == "") datos = "Error ";
return datos;
}

Por lo general una tarea de este tipo tardan tiempo en ejecutarse, por lo que debemos ejecutarlas en segundo plano para que, en el caso de usar interfaz gráfica, no se bloquee y que permita hacer al usuario otras tareas mientras este se termina.

Po lo mencionado anteriormente la función se implementa de forma asíncrona. Claro, pero en el archivo fuente esta la implementación normal síncrona para que puedan comparar.

Otra función interesante que cree fue la de buscar IP en un texto. La cual es:

   Public Shared Function BuscarIPenTexto(Texto As String) As String
'Texto = Texto.Replace(" ", "")
Texto &= " "
Dim ips As String = ""
Dim contPuntos As Integer
For Each
c As String In Texto
Select Case c
Case "0" To "9"
ips &= c
Case "."
contPuntos += 1
ips &= c
Case Else
If
contPuntos = 3 Then Return ips
ips =
""
contPuntos = 0
End Select
Next
Return
""
End Function

Es bastante simple. Lo que hace es buscar en el texto números y puntos. Si la secuencia no coincide con direcciones IP IPv4, salta al siguiente. Devolverá la primera coincidencia válida.

Y finalmente la función maestra AsyncDarMiIPPublica que se encarga de entregarnos la IP pública.    

    Public Shared Async Function AsyncDarMiIPPublica() As Task(Of String)
'Proveedores de servicio
'
'Importante:
'Es conveniente de que si tienes una web propia, realices un
'pagina que de la ip y montarla en tu hosting. Para asi, evitar
'el uso de el ancho de banda del dueño del servicio.
'
'Los sitios mencionados a continuación ofrecen el servicio sin
'anuncios, por lo que no existe problemas por falta de monetización.
'URL-> http://checkip.dyndns.org
'URL-> http://ipinfo.info/html/geolocation_2.php
'URL-> http://ipinfo.info/google/

Dim listaProveedores As New List(Of String)
Dim MiIP As String = ""
Dim OcurrioError As Boolean
Dim
ContenidoWeb As String

'Se agregan las URL al listado de comprobación,
'Si falla una, se intenta con la otra.
listaProveedores.Add("http://checkip.dyndns.org")
listaProveedores.Add(
"http://ipinfo.info/google/")
listaProveedores.Add(
"http://ipinfo.info/html/geolocation_2.php")

For Each Proveedor As String In listaProveedores
OcurrioError =
False
ContenidoWeb = Await AsyncDarContenidoHtmlWebsite(Proveedor)
If ContenidoWeb.StartsWith("Error") Then
'Si ocurre el error se intenta con la
'siguiente URL de la lista
OcurrioError = True
Continue For
Else
MiIP = BuscarIPenTexto(ContenidoWeb)
OcurrioError =
False
Exit For
End If
Next
If
OcurrioError Then MiIP = "Error"
Return MiIP
End Function

Básicamente lo que hago es recorrer una lista de proveedores del servicio de IP publica en internet, para que me den la dirección IP de la máquina de donde las estoy llamando. Pero ojo, estoy solo listando los que no tienen publicidad, no es ético para con el editor del sitio web, usar un servicio que depende de publicidad.

Entonces si un proveedor me falla, salto al siguiente, por lo que obtendré de forma segura mi IP. Y también esta función es asíncrona, para evitar los bloqueos de interfaz de usuario y poder hacerle seguimiento como, por ejemplo, poder cancelar la operación si dura demasiado tiempo, o si el usuario desea cancelar.

Implementación del código

La implementación de esta clase es bastante simple, en modo de consola podemos hacerla de esta forma:

Pegue el código en el procedimiento Main.

        Dim tokenSourse As New Threading.CancellationTokenSource()
Dim t As Task
Dim MiIP As String = ""
Dim ib As Integer
Dim
b() As String = {"-", "", "|", "/"}
Dim tEspera As New Stopwatch

tEspera.Start()
'Sub-proceso secundario que realiza la tarea de buscar la Ip Pública
t = Task.Factory.StartNew(Sub()
MiIP =
WebHelper.AsyncDarMiIPPublica().Result
End Sub,
tokenSourse.Token)

'Proceso sincrono que espera a que se de el IP
'Como estamos en modo consola y no tenemos interfaz grafica
'simulamos una. jejejeje.
Do
Console.CursorLeft = 0
Console.CursorTop = 1
ib += 1
If ib > b.GetUpperBound(0) Then ib = 0
'Mensaje de barrita rotativa. ;)
EscribeLinea("Obteniendo informacion..." & b(ib))
Threading.
Thread.Sleep(100)
'Esperamos 10 segundos que se complete la tarea, sino
'mostramos el mensaje y la posibilidad de cancelar.
If tEspera.Elapsed.TotalSeconds > 10 Then
EscribeLinea(" ¡Vaya! se esta tardando mucho...presiona ""c"" si deseas cancelar.")
If Console.KeyAvailable AndAlso
Console.ReadKey(True).Key = ConsoleKey.C Then
MiIP = ""
'Se cancela el proceso en segundo plano y salimos de la interfaz grafica XD.
tokenSourse.Cancel()
Exit Do
End If
Else
'Se consume el buffer de teclas.
If Console.KeyAvailable Then Console.ReadKey(True)
End If
Loop Until
MiIP <> ""


'Se muestra la IP pública
Console.Clear()
Console.CursorLeft = 0
Console.CursorTop = 1
If MiIP = "" Then
EscribeLinea("Proceso cancelado")
Else
EscribeLinea("Mi ip " & MiIP)
End If
EscribeLinea("Presiona enter para continuar.")
LeeLinea()

Y Listo, creo que con este código más que suficiente para crear robustas Apps que requieran de este servicio. También está implementada para C# y la pueden encontrar en el archivo descargable que está más abajo.

Zona de Descarga:


descarga

Totalmente libre de virus y software malicioso, así que no esperes más en descargartelo ahora.

No olvides darnos una opinion acerca del programa, para mejorar el contenido.

Escrito por

Elimar García

Eli Programa.

20/10/2018

 

Calificación 
21/10/2018

Excelente

Gran post

    ¡Escriba su propia reseña!

    Escriba una reseña

    Obtener IP Publica en VB.NET y CSharp

    Obtener IP Publica en VB.NET y CSharp

    Como saber la IP pública escrita en vb.net y c#. Código fuente disponible.

    Haz una pregunta

    No se requiere registro

    Si luego de leer nuestro articulo aun tiene dudas, puede hacer su pregunta utilizando el siguiente formulario.

    (Opcional)
    *(Requerido para ser notificado cuando la respuesta este disponible)

    Si el enlace de descarga redirige a otro producto que no es el descrito en el artículo o está roto, reportarlo usando nuestro

     FORMULARIO DE REPORTE