Scanner de Red en Vb.net

Existen ocasiones en que nos encontramos conectados a una red LAN y por alguna razon nos gustaria conocer detalles de otros equipos que esten conectados a dicha red, para determinarlo se podrian usar varios comandos de DOS, sin embargo se podria automatizar este proceso mediante una aplicacion que scanee toda la red en la que nos encontremos a traves del grupo de direccion ip al que pertenezca y nos permita ver el resultado encontrado de una manera visualmente ordenada.

en la siguiente image podemos ver la forma de la aplicacion que pretendemos desarrollar:

Bien, manos a la obra, comencemos…

entre los controles a utilizar tenemos:

* 2 grillas o DatagridView

* 5 Textbox

* 3 Botones

* 1 RadioButton

* Varios labels y groupbox (para indicar los nombres de cada campo y ordenar el diseño).

al agregar los controles al formulario deberiamos de crear un diseño parecido al que se ve en la siguiente imagen:

cabe aclarar que se esta utilizando una grilla para almacenar la direccion Ip, nombre del equipo y estado, y una segunda grilla para ir almacenando la direccion MAC de cada equipo, los datos se van cargando de forma paralela en cada grilla, es decir que la informacion que aparece en una fila es equivalente a la de la fila en la otra grilla (se realiza este proceso de esta manera usando 2 grillas a conveniencia para facilitar ciertas operaciones que se hacen internamente en el programa).

Pasando a la seccion de codigo del formulario, debemos importar las siguientes librerias:


Imports System

Imports System.Net

Imports System.Net.NetworkInformation

Imports System.Text

Imports System.Text.RegularExpressions

Imports System.Net.Dns

Luego, Declaramos las siguientes variables como globales:

Dim cont, aux As Integer
Private inicio, fin As Integer

Public c() As String

Public d() As String

Dim direccion_Ip As String

Dim mimac As String

Dim encontro As Integer

Bien, ahora pasemos al evento load del formulario, alli lo que haremos sera almacenar en un archivo plano todas las direcciones fisicas o MAC de nuestro computador (Habran tantas direcciones como interfaces de red tengamos), ademas vamos a traer todas las direcciones Ip de las interfaces de red que esten activas y las vamos a cargar en el combobox para luego escoger la ip local de nuestro pc e identificarlo dentro de la red. el codigo de dicho evento load es el siguiente:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Lblmsg.Visible = False

Me.Button1.Enabled = False

Try

Shell("cmd.exe /c getmac >mi_mac.txt", AppWinStyle.Hide)

Catch ex As Exception

End Try
'++++++++++++++++++++++++++++++++++++++++

Dim nombre_Host As String = GetHostName.ToString

'traigo todas las ip y las coloco en el combo

Me.TextBox_ipl.Items.Clear()

For Each ip In System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList

If ip.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then

'Añadir solo las correspoondientes a IP4

Me.TextBox_ipl.Items.Add(ip.ToString)

End If

Next

End Sub

Ahora, procedemos a codificar nuestro boton validar, lo que hara es determinar si una direccion ip esta bien escrita y determinar a que grupo pertenece la ip, coloquemos lo siguiente en dicho boton:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.DataGridView1.Rows.Clear()

Me.grilla_mac.Rows.Clear()

' Me.TextBox_ipl.Items.Clear()

Me.TextBox_equipol.Clear()

Me.TextBox_macl.Clear()

Me.TextBox_estadol.Clear()

If TextBox1.Text <> "" Then

checkRejex(TextBox1.Text)

Else

Me.Lblmsg.Visible = True

Lblmsg.Text = "Por favor Ingrese Una Ip Valida!"

Lblmsg.ForeColor = Color.Red

End If

If TextBox2.Text <> "" Then

checkRejex(TextBox2.Text)

Else

Me.Lblmsg.Visible = True

Lblmsg.Text = "Por favor Ingrese Una Ip Valida!"

Lblmsg.ForeColor = Color.Red

End If

End Sub

La funcion checkRejex es la encargada de verificar cada una de las ip, procedemos a crearla:

Private Sub checkRejex(ByVal strFindin As String)

Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")

If myRegex.IsMatch(strFindin) Then

Me.Lblmsg.Visible = True

Lblmsg.Text = "Direccion Ip Valida"

Lblmsg.ForeColor = Color.Green

Me.Button1.Enabled = True

Else

Me.Lblmsg.Visible = True

Lblmsg.Text = "Por favor Ingrese Una Direccion Ip Valida!"

Lblmsg.ForeColor = Color.Red

End If

End Sub

Bien Amigos, pasemos ahora al boton scanear, aqui es donde se realiza el proceso de busqueda y presentacion de los resultados, para poder comenzar el escaneo es necesario que seleccione la ip local del pc en el combobox de la izquierda y luego se defina el rango de ip a explorar, habiendo cumplido con este requisito, basicamente lo que se hace es determinar cual es la direccion mac que se esta utilizando, para ello nuevamente se ejecuta la instruccion getmac, luego en el archivo que se crea, lo recorremos hasta encontrar el caracter que indica que esta activo \ y tomamos la primera direccion encontrada (es de resaltar que el caracter “\” se encuentra en la posicion 20 de la cadena de caracteras).

el codigo del boton escanera es el siguiente:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If (Me.TextBox_ipl.Text = "") Then

MsgBox("Seleccione su direccion Ip Local por favor!", MsgBoxStyle.Exclamation, "Notificacion")

Else

direccion_Ip = Me.TextBox_ipl.Text

'Capturo la direccion mac local

Dim datos2 As String

Dim j As Integer

j = 0

Shell("cmd.exe /c getmac >mi_mac.txt", AppWinStyle.Hide)

FileOpen(1, "mi_mac.txt", OpenMode.Input, OpenAccess.Read)

While Not EOF(1)

datos2 = LineInput(1)

ReDim Preserve d(j)

d(j) = datos2

j = j + 1

End While

FileClose(1)

'----------------------
''ya tengo todas las mac de mi computador, ahora busco la que estoy utilizando

encontro = 0

For cont2 As Integer = 3 To j - 1
' MsgBox(d(cont2)(20))

If (d(cont2)(20) = "\") And (encontro = 0) Then

'si es igual, esta es la mac que estoy utilizando

mimac = d(cont2).Substring(0, 18)

encontro = 1

' MsgBox(mimac)

End If

Next

Bien hasta aqui solo se ha extraido la direccion mac local del equipo, la imagen siguiente nos pude dar idea del proceso que se ha realizado:


Ahora, continuando con  nuestro codigo en el boton scanear, hay que realizar una operacion ciclica de ir haciendo ping a cada direccion ip incluida en el rango y asi determinar si el equipo esta disponible o no en la red.

ademas vamos a utilizar el comando arp -a que lista todas las direcciones mac o fisicas de las direcciones ip que vallamos recorriendo en el ciclo y de esa manera obtenemos la informacion que estamos buscando, luego se agregan los resultados a las grillas y los datos del equipo local en sus respectivos campos de texto, podemos ver la continuacion del codigo del boton scanera a continuacion:

Dim ping_usuario As New Ping

Dim opt = New PingOptions()

Dim data As String

Dim xxx As Integer

opt.DontFragment = True

Dim xx As String

Dim reply As PingReply

Dim cc As Integer = 0

Dim cco As Integer = 0

Me.Button2.Enabled = False

Me.Button1.Enabled = False

Me.TextBox1.Enabled = False

Me.TextBox2.Enabled = False

Try

'// Create a buffer of 32 bytes of data to be transmitted.

data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

Dim buffer() As Byte = Encoding.ASCII.GetBytes(data)

Dim timeout As Integer = 120

Dim h As String

Dim v() As String

v = Split(TextBox1.Text, ".")

inicio = v(UBound(v))

v = Split(TextBox2.Text, ".")

fin = v(UBound(v))

cont = -1

'..........

If (inicio > fin) Then

MsgBox("La Direccion Ip es Invalida, La Direccion de inicio debe ser Menor que la Final!", MsgBoxStyle.Exclamation, "Advertencia")

Me.Button2.Enabled = True

Me.TextBox1.Enabled = True

Me.TextBox2.Enabled = True

Exit Sub

End If

xxx = CInt(v(0))

If xxx >= 0 And xxx <= 127 Then

Label9.Text = "La Red es de Clase: A"

End If

If xxx >= 128 And xxx <= 191 Then

Label9.Text = "La Red es de Clase: B"

End If

If xxx >= 192 And xxx <= 223 Then

Label9.Text = "La Red es de Clase: C"

End If

'..........

For index As Integer = inicio To fin

xx = v(0) & "." & v(1) & "." & v(2) & "." & index

reply = ping_usuario.Send(xx, timeout, buffer, opt)

If (reply.Status = IPStatus.Success) Then

h = Dns.GetHostEntry(xx).HostName

Shell("cmd.exe /c arp -a >dir_mac.txt")

If (Trim(direccion_Ip) <> xx) Then

'esta es mi IP(Ip Local)

DataGridView1.Rows.Add(xx, h, "Encontrado")

Else

Me.TextBox_ipl.Text = xx

Me.TextBox_equipol.Text = h

Me.TextBox_macl.Text = mimac

Me.TextBox_estadol.Text = "Encontrado"

End If

cont = cont + 1

End If

Next

'dirm()

Me.Button2.Enabled = True

Me.TextBox1.Enabled = True

Me.TextBox2.Enabled = True

'------

Dim datos As String

Dim i As Integer

FileOpen(1, "dir_mac.txt", OpenMode.Input, OpenAccess.Read)

While Not EOF(1)

datos = LineInput(1)

ReDim Preserve c(i)

c(i) = datos

i += 1

End While

FileClose(1)

If (cont <> 0) Then

aux = 3

'si se encontraran equipos en red

'verifico cuantos equipos hay

'asigno a la grilla todas las direcciones

For udg = aux To (cont + aux) - 1

grilla_mac.Rows.Add(c(udg).Substring(23, 18))

Next

'----------------------

End If

Catch ex As Exception

End Try

End If

End Sub

Por ultimo solo debemos colocar en nuestro boton cerrar la instruccion

Close()

Bien ya hemos terminado la aplicacion ahora tenemos que probarla, para ello hay que establecer direcciones ip a los equipos que tengamos y constatar que pertenezcan al mismo grupo de trabajo, he decidido establecer a mi tarjeta de red la siguiente direccion ip: 192.168.169.1

Dicha Ip corresponde al adaptador anfitrion de mi maquina virtual vmware, ahora voy a configurar la direccion ip del cliente en mi maquina virtual en la cual tengo instalado el windows xp, en la siguiente imagen se ve la ip que le he colocado:

Ahora podemos probar la conexion haciendo ping del equipo host al virtual:

y ahora probemos haciendo ping del equipo virtual al anfitrion:

Bien, ya sabemos que los equipos estan conectados, llego la hora de poner a prueba nuestro programa ejecutandolo:

Como se puede ver en la imagen, ya estan cargadas todas las direcciones ip del equipo (dependiendo de las interfaces que tengamos activas), procedemos a escoger la local con la cual vamos a realizar la busqueda, luego establecemos un rango de ip que pertenezcan a la misma clase y hacemos clic sobre validar, si todo esta bien, se activara el boton scanear y procedemos a presionarlo para comenzar la busqueda:

Como resultado podemos observar que se ha encontrado los equipos que estan conectados a la red y tambien se han mostrado los detalles del equipo local.

Eso es todo amigos, espero y les resulte de utilidad la aplicacion, para descargarla has clic sobre el siguiente enlace:

Descargar Aplicacion

Anuncios

7 respuestas a “Scanner de Red en Vb.net

    • hola carlos amorocho, se me paso implementar el control textbox para validacion de ip, pero pensare utilizarlo en otro post que viene mas adelante o actualizar este, gracias por recordarmelo…

      • HOLA ESTA MUY BUENO EL PROGRAMA PERO COMO PUEDO HACER, SI LE PONGO DEL RANGO 97, AL 130, ME DA TODAS LAS QUE ESTÁN CONECTADAS, CON EL ESTADO DE ENCONTRADO COMO HAGO PARA QUE ME DE LAS QUE NO SE ESTÁN USANDO EJEMPLO

        179.30.97.91—–ENCONTRADO
        179.30.97.92—–ENCONTRADO
        179.30.97.93—–ENCONTRADO
        179.30.97.94—–DESCONECTADO
        179.30.97.95—–DESCONECTADO
        179.30.97.96—–ENCONTRADO
        179.30.97.97—–ENCONTRADO
        179.30.97.98—–DESCONECTADO

        ALGO ASI NO SE SI ME EXPLICO

  1. Amigo, tu programa tambien puede sacar el nombre de la Pc….
    Por ejemplo, sacas Nombre del Equipo Local, asi tambien se podria sacar dependiendo de la Ip
    ejemplo
    192.168.169.5
    Aprendiz-Pc

    ??
    Gracias….

  2. Estoy probando la aplicacion y esta muy bueno ahora a realizar algunas pruebas y algunos cambios.
    Se te agradece el aporte muy bien explicado.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s