End If
Else "Si la tecla presionada es diferente de un dígito o de la tecla Backspace.
e.KeyChar = "" "Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub TextBoxocteto2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxocteto2.TextChanged
End Sub
Private Sub TextBoxocteto3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBoxocteto3.KeyPress
If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then "Los únicos caracteres que se permitirá introducir en el TextBoxocteto3 serán los números del 0 al 9 (ASCII del 48 al 57) y el retroceso de espacio o backspace para borrar números introducidos, que es el ASCII 8.
Dim numdigitosocteto3 As Integer = Len(TextBoxocteto3.Text) "Para contar cuántos dígitos hay en el TextBoxocteto3.
If numdigitosocteto3 = 3 And (Asc(e.KeyChar) <> 8) Then "Si ya hay tres dígitos, ya no se podrá escribir otro, pues el máximo que se puede escribir es 255, pero siempre se podrá usar la tecla Backspace.
e.KeyChar = "" "Borra el dígito que se ha digitado.
End If
Else "Si la tecla presionada es diferente de un dígito o de la tecla Backspace.
e.KeyChar = "" "Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub TextBoxocteto3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxocteto3.TextChanged
End Sub
Private Sub TextBoxocteto4_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBoxocteto4.KeyPress
If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then "Los únicos caracteres que se permitirá introducir en el TextBoxocteto4 serán los números del 0 al 9 (ASCII del 48 al 57) y el retroceso de espacio o backspace para borrar números introducidos, que es el ASCII 8.
Dim numdigitosocteto4 As Integer = Len(TextBoxocteto4.Text) "Para contar cuántos dígitos hay en el TextBoxocteto4.
If numdigitosocteto4 = 3 And (Asc(e.KeyChar) <> 8) Then "Si ya hay tres dígitos, ya no se podrá escribir otro, pues el máximo que se puede escribir es 255, pero siempre se podrá usar la tecla Backspace.
e.KeyChar = "" "Borra el dígito que se ha digitado.
End If
Else "Si la tecla presionada es diferente de un dígito o de la tecla Backspace.
e.KeyChar = "" "Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub TextBoxocteto4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxocteto4.TextChanged
End Sub
Private Sub TextBoxmascara_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBoxmascara.KeyPress
If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then "Los únicos caracteres que se permitirá introducir en el TextBoxmascara serán los números del 0 al 9 (ASCII del 48 al 57) y el retroceso de espacio o backspace para borrar números introducidos, que es el ASCII 8.
Dim numdigitosmascara As Integer = Len(TextBoxmascara.Text) "Para contar cuántos dígitos hay en el TextBoxmascara.
If numdigitosmascara = 2 And (Asc(e.KeyChar) <> 8) Then "Si ya hay dos dígitos, ya no se podrá escribir otro, pues el máximo que se puede escribir es 30, pero siempre se podrá usar la tecla Backspace.
e.KeyChar = "" "Borra el dígito que se ha digitado.
End If
Else "Si la tecla presionada es diferente de un dígito o de la tecla Backspace.
e.KeyChar = "" "Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub TextBoxmascara_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxmascara.TextChanged
End Sub
Private Sub TextBoxnumdesubredes_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBoxnumdesubredes.KeyPress
If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then "Los únicos caracteres que se permitirá introducir en el TextBoxnumsubredes serán los números del 0 al 9 (ASCII del 48 al 57) y el retroceso de espacio o backspace para borrar números introducidos, que es el ASCII 8.
Dim numdigitosredes As Integer = Len(TextBoxnumdesubredes.Text) "Para contar cuántos dígitos hay en el TextBoxnumsubredes.
If numdigitosredes = 3 And (Asc(e.KeyChar) <> 8) Then "Si ya hay tres dígitos, ya no se podrá escribir otro, pues el máximo que se puede escribir es 999, pero siempre se podrá usar la tecla Backspace.
e.KeyChar = "" "Borra el dígito que se ha digitado.
End If
Else "Si la tecla presionada es diferente de un dígito o de la tecla Backspace.
e.KeyChar = "" "Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub Buttonsubnetear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonsubnetear.Click
Dim tempnumerodehosts As String "Usada para el método de la burbuja simple.
Dim tempnombresubred As String "Usada para el método de la burbuja simple.
"If Ctype(TextBoxocteto1.Text, Integer) = 0 Or Val(TextBoxocteto2.Text) = 0 Or Val(TextBoxmascara.Text) < 8 Or Val(TextBoxmascara.Text) > 30 Or Val(TextBoxnumdesubredes.Text) < 1 Or TextBoxocteto1.Text = "" Or TextBoxocteto2.Text = "" Or TextBoxocteto3.Text = "" Or TextBoxocteto4.Text = "" Or TextBoxmascara.Text = "" Or TextBoxnumdesubredes.Text = "" Then
If Val(TextBoxocteto1.Text) = 0 Or Val(TextBoxocteto2.Text) = 0 Or Val(TextBoxmascara.Text) < 8 Or Val(TextBoxmascara.Text) > 30 Or Val(TextBoxnumdesubredes.Text) < 1 Or TextBoxocteto1.Text = "" Or TextBoxocteto2.Text = "" Or TextBoxocteto3.Text = "" Or TextBoxocteto4.Text = "" Or TextBoxmascara.Text = "" Or TextBoxnumdesubredes.Text = "" Then
MsgBox("Dirección IP, máscara de subred inválida, o cantidad de subredes inválida.")
Else "Si los datos introducidos son válidos.
Dim nombresubred(999) As String
Dim numerodehosts(999) As String
Dim contadortotaldehosts As Integer "Para contar el número total de hosts que se desean (al sumar todos los hosts de cada subred), y luego poder evaluar si el número no es demasiado alto, es decir si hay capacidad de ofrecer esa cantidad de hosts.
Dim maximohostsdisponibles As Integer
"Ciclo para introducir nombres de las subredes y cantidad de hosts para cada subred.
For i As Integer = 1 To Val(TextBoxnumdesubredes.Text)
nombresubred(i) = InputBox("Nombre de la subred" & Str(i))
numerodehosts(i) = InputBox("Número de hosts de la subred" & Str(i))
contadortotaldehosts += Val(numerodehosts(i))
maximohostsdisponibles += 2 ^ (32 – mascara(Val(numerodehosts(i))))
Next
"TextBoxipsrequeridas.Text = contadortotaldehosts
"TextBoxipsdisponibles.Text = maximohostsdisponibles
"TextBoxipsenredoriginal.Text = 2 ^ (32 – Val(TextBoxmascara.Text)) – 2
"TextBoxporcentajetotalreservado.Text = Str(Math.Round(Val(TextBoxipsrequeridas.Text) * 100 / Val(TextBoxipsenredoriginal.Text), 0)) & "%"
"If Val(TextBoxipsrequeridas.Text) > Val(TextBoxipsenredoriginal.Text) Then
If contadortotaldehosts > (2 ^ (32 – Val(TextBoxmascara.Text)) – 2) Then
MsgBox("La cantidad de hosts requeridos es mayor a la cantidad de hosts disponibles.")
"Borra resultados.
With AxMSFlexGrid1
For fila As Integer = 0 To .Rows – 1
.Row = fila
For columna As Integer = 0 To .Cols – 1
.set_TextMatrix(fila, columna, "") "Por estar dentro de los For anidados, con esto se ponen valores String Empty en todas las celdas, de modo que no aparezca nada y queden todas las celdas limpias y sin resultados de cálculos hechos anteriormente.
Next
Next
End With
TextBoxipsrequeridas.Text = ""
TextBoxipsdisponibles.Text = ""
TextBoxipsenredoriginal.Text = ""
TextBoxporcentajetotalreservado.Text = ""
TextBoxporcentajesubneteadoreservado.Text = ""
Else
TextBoxipsrequeridas.Text = contadortotaldehosts
TextBoxipsdisponibles.Text = maximohostsdisponibles
TextBoxipsenredoriginal.Text = 2 ^ (32 – Val(TextBoxmascara.Text)) – 2
TextBoxporcentajetotalreservado.Text = Str(Math.Round(Val(TextBoxipsrequeridas.Text) * 100 / Val(TextBoxipsenredoriginal.Text), 0)) & "%"
"TextBoxporcentajetotalreservado.Text = Str(Math.Round(Val(TextBoxipsdisponibles.Text) * 100 / Val(TextBoxipsenredoriginal.Text), 0)) & "%"
TextBoxporcentajesubneteadoreservado.Text = Str(Math.Round(Val(TextBoxipsrequeridas.Text) * 100 / Val(TextBoxipsdisponibles.Text), 0)) & "%"
"Método de la burbuja simple para ordenar las subredes de mayor a menor, en base a la cantidad de hosts por subred.
For i As Integer = 1 To (Val(TextBoxnumdesubredes.Text) – 1)
For i2 As Integer = 1 To (Val(TextBoxnumdesubredes.Text) – 1)
If Val(numerodehosts(i2)) < Val(numerodehosts(i2 + 1)) Then
tempnumerodehosts = numerodehosts(i2)
tempnombresubred = nombresubred(i2)
numerodehosts(i2) = numerodehosts(i2 + 1) "Declaración destructiva.
Nombresubred(i2) = nombresubred(i2 + 1) "Declaración destructiva.
Numerodehosts(i2 + 1) = tempnumerodehosts
nombresubred(i2 + 1) = tempnombresubred
End If
Next
Next
"A partir de aquí se da el proceso de subneteo.
"Dim mascarabase As Integer = Val(TextBoxmascara.Text)
"Dim mascaranueva As Integer
"Obteniendo las máscaras de subred de cada una de las subredes introducidas anteriormente, y los respectivos saltos o incrementos, así como también los valores de cada octeto para cada red.
Dim mascarasubred(999) As Integer
Dim ultimobit(999) As Integer
Dim incremento(999) As Integer
Dim octetoincremento(999) As Integer "Para conocer el octeto en el que se aplicará el incremento, que podría ser el octeto 1, 2, 3 o 4.
Dim octeto1red(999) As Integer "Para octener la dirección de red del octeto 1.
Dim octeto2red(999) As Integer "Para obtener la dirección de red del octeto 2.
Dim octeto3red(999) As Integer "Para obtener la dirección de red del octeto 3.
Dim octeto4red(999) As Integer "Para obtener la dirección de red del octeto 4.
Dim octeto1broadcast(999) As Integer "Para octener la dirección de broadcast del octeto 1.
Dim octeto2broadcast(999) As Integer "Para obtener la dirección de broadcast del octeto 2.
Dim octeto3broadcast(999) As Integer "Para obtener la dirección de broadcast del octeto 3.
Dim octeto4broadcast(999) As Integer "Para obtener la dirección de broadcast del octeto 4.
"Dim octeto1redinicial(999) As Integer "Para obtener la dirección del octeto 1 del primer host utilizable de la subred.
"Dim octeto2redinicial(999) As Integer "Para obtener la dirección del octeto 2 del primer host utilizable de la subred.
"Dim octeto3redinicial(999) As Integer "Para obtener la dirección del octeto 3 del primer host utilizable de la subred.
"Dim octeto4redinicial(999) As Integer "Para obtener la dirección del octeto 4 del primer host utilizable de la subred.
"Dim octeto1nextred(999) As Integer "Para obtener la dirección de red siguiente en el el octeto 1.
"Dim octeto2nextred(999) As Integer "Para obtener la dirección de red siguiente en el el octeto 2.
"Dim octeto3nextred(999) As Integer "Para obtener la dirección de red siguiente en el el octeto 3.
"Dim octeto4nextred(999) As Integer "Para obtener la dirección de red siguiente en el el octeto 4.
Octeto1red(1) = Val(TextBoxocteto1.Text)
octeto2red(1) = Val(TextBoxocteto2.Text)
octeto3red(1) = Val(TextBoxocteto3.Text)
octeto4red(1) = Val(TextBoxocteto4.Text)
"octeto1redinicial(1) = Val(TextBoxocteto1.Text) + 1
"octeto2redinicial(1) = Val(TextBoxocteto2.Text) + 1
"octeto3redinicial(1) = Val(TextBoxocteto3.Text) + 1
"octeto4redinicial(1) = Val(TextBoxocteto4.Text) + 1
For i3 As Integer = 1 To (Val(TextBoxnumdesubredes.Text))
mascarasubred(i3) = mascara(Val(numerodehosts(i3)))
"Obteniendo los incrementos o saltos.
If mascarasubred(i3) >= 1 And mascarasubred(i3) <= 8 Then
ultimobit(i3) = 8
incremento(i3) = 2 ^ (ultimobit(i3) – mascarasubred(i3))
octetoincremento(i3) = 1
Else
If mascarasubred(i3) >= 9 And mascarasubred(i3) <= 16 Then
ultimobit(i3) = 16
incremento(i3) = 2 ^ (ultimobit(i3) – mascarasubred(i3))
octetoincremento(i3) = 2
Else
If mascarasubred(i3) >= 17 And mascarasubred(i3) <= 24 Then
ultimobit(i3) = 24
incremento(i3) = 2 ^ (ultimobit(i3) – mascarasubred(i3))
octetoincremento(i3) = 3
Else
ultimobit(i3) = 32 "If mascarasubred(i3) >= 25 And mascarasubred(i3) <= 30
incremento(i3) = 2 ^ (ultimobit(i3) – mascarasubred(i3))
octetoincremento(i3) = 4
End If
End If
End If
"Aplicando los incrementos correspondientes o manteniendo los valores de los octetos según corresponda.
If octetoincremento(i3) = 1 Then
octeto1red(i3 + 1) = octeto1red(i3) + incremento(i3)
octeto1broadcast(i3) = octeto1red(i3 + 1)
Else
octeto1red(i3 + 1) = octeto1red(i3)
octeto1broadcast(i3) = octeto1red(i3 + 1)
End If
If octetoincremento(i3) = 2 Then
octeto2red(i3 + 1) = octeto2red(i3) + incremento(i3)
octeto2broadcast(i3) = octeto2red(i3 + 1)
If octeto2red(i3 + 1) > 255 Then "Debido a que cada octeto soporta un número máximo de 11111111 binario ó 255 decimal, entonces si se pasa, reiniciar en cero y sumarle uno al octeto anterior.
Octeto2red(i3 + 1) = 0
octeto1red(i3 + 1) += 1
octeto2broadcast(i3) = octeto2red(i3 + 1)
octeto1broadcast(i3) = octeto1red(i3 + 1) + 1
End If
Else
octeto2red(i3 + 1) = octeto2red(i3)
octeto2broadcast(i3) = octeto2red(i3 + 1)
End If
If octetoincremento(i3) = 3 Then
octeto3red(i3 + 1) = octeto3red(i3) + incremento(i3)
octeto3broadcast(i3) = octeto3red(i3 + 1)
"If octeto3red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 3, entonces la dirección de broadcast de la subred actual deberá tener "255" en el tercer octeto, y restarle 1 el segundo octeto de la dirección de subred actual.
" octeto3broadcast(i3) = 255
" octeto2broadcast(i3) -= 1
"Else "Si el tercer octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al tercer octeto de la dirección de subred actual.
" octeto3broadcast(i3) = octeto3red(i3 + 1) – 1
"End If
If octeto3red(i3 + 1) > 255 Then "Debido a que cada octeto soporta un número máximo de 11111111 binario ó 255 decimal, entonces si se pasa, reiniciar en cero y sumarle uno al octeto anterior.
Octeto3red(i3 + 1) = 0
octeto2red(i3 + 1) += 1
octeto3broadcast(i3) = octeto3red(i3 + 1)
octeto2broadcast(i3) = octeto2red(i3 + 1) + 1
"If octeto3red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 3, entonces la dirección de broadcast de la subred actual deberá tener "255" en el tercer octeto, y restarle 1 el segundo octeto de la dirección de subred actual.
" octeto3broadcast(i3) = 255
" octeto2broadcast(i3) -= 1
"Else "Si el tercer octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al tercer octeto de la dirección de subred actual.
" octeto3broadcast(i3) = octeto3red(i3 + 1) – 1
"End If
End If
Else
octeto3red(i3 + 1) = octeto3red(i3)
octeto3broadcast(i3) = octeto3red(i3 + 1)
"If octeto3red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 3, entonces la dirección de broadcast de la subred actual deberá tener "255" en el tercer octeto, y restarle 1 el segundo octeto de la dirección de subred actual.
" octeto3broadcast(i3) = 255
" octeto2broadcast(i3) -= 1
"Else "Si el tercer octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al tercer octeto de la dirección de subred actual.
" octeto3broadcast(i3) = octeto3red(i3 + 1) – 1
"End If
End If
If octetoincremento(i3) = 4 Then
octeto4red(i3 + 1) = octeto4red(i3) + incremento(i3)
octeto4broadcast(i3) = octeto4red(i3 + 1)
"Las siguientes condiciones If anidadas son para encontrar las direcciones de broadcast para cada uno de los octetos, que sería la dirección IP inmediata anterior a la siguiente dirección de subred. Por ejemplo si la siguiente dirección de subred fuera 192.168.0.0, la dirección de broadcast actual será la IP inmediata anterior a 192.168.0.0, es decir: 192.167.255.255.
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 And octeto2red(i3 + 1) = 0 Then
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) = 255
octeto1broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 Then
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
octeto4broadcast(i3) = 255
octeto3broadcast(i3) -= 1
Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
End If
End If
End If
"If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
" octeto4broadcast(i3) = 255
" octeto3broadcast(i3) -= 1
"Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
" octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
"End If
If octeto4red(i3 + 1) > 255 Then "Debido a que cada octeto soporta un número máximo de 11111111 binario ó 255 decimal, entonces si se pasa, reiniciar en cero y sumarle uno al octeto anterior.
Octeto4red(i3 + 1) = 0
octeto3red(i3 + 1) += 1
octeto4broadcast(i3) = octeto4red(i3 + 1)
octeto3broadcast(i3) = octeto3red(i3 + 1) "Broadcast actual del octeto 3 es igual al octeto 3 de la red siguiente.
"Las siguientes condiciones If anidadas son para encontrar las direcciones de broadcast para cada uno de los octetos, que sería la dirección IP inmediata anterior a la siguiente dirección de subred. Por ejemplo si la siguiente dirección de subred fuera 192.168.0.0, la dirección de broadcast actual será la IP inmediata anterior a 192.168.0.0, es decir: 192.167.255.255.
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 And octeto2red(i3 + 1) = 0 Then
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) = 255
octeto1broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 Then
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
octeto4broadcast(i3) = 255
octeto3broadcast(i3) -= 1
Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
End If
End If
End If
"If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
" octeto4broadcast(i3) = 255
" octeto3broadcast(i3) -= 1
"Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
" octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
"End If
End If
Else
octeto4red(i3 + 1) = octeto4red(i3)
octeto4broadcast(i3) = octeto4red(i3 + 1)
"Las siguientes condiciones If anidadas son para encontrar las direcciones de broadcast para cada uno de los octetos, que sería la dirección IP inmediata anterior a la siguiente dirección de subred. Por ejemplo si la siguiente dirección de subred fuera 192.168.0.0, la dirección de broadcast actual será la IP inmediata anterior a 192.168.0.0, es decir: 192.167.255.255.
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 And octeto2red(i3 + 1) = 0 Then "200.0.0.0
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) = 255
octeto1broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 And octeto3red(i3 + 1) = 0 Then
octeto4broadcast(i3) = 255
octeto3broadcast(i3) = 255
octeto2broadcast(i3) -= 1
Else
If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
octeto4broadcast(i3) = 255
octeto3broadcast(i3) -= 1
Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
End If
End If
End If
"If octeto4red(i3 + 1) = 0 Then "Si la siguiente dirección de subred tiene un "0" en el octeto 4, entonces la dirección de broadcast de la subred actual deberá tener "255" en el cuarto octeto, y restarle 1 el tercer octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.8.0, la dirección de broadcast de la subred actual será 128.100.7.255.
" octeto4broadcast(i3) = 255
" octeto3broadcast(i3) -= 1
"Else "Si el cuarto octeto de la siguiente dirección de subred no tiene un "0", entonces simplemente restarle 1 al cuarto octeto de la dirección de subred actual. Ejemplo, si la siguiente subred es 128.100.30.128, la dirección de broadcast de la subred actual será 128.100.30.127.
" octeto4broadcast(i3) = octeto4red(i3 + 1) – 1
"End If
End If
"Ya que se han realizado todos los cálculos requeridos en el proceso de subneteo, se tienen todos los valores necesarios almacenados en variables y sólo falta mostrarlos en pantalla, que es lo que se hace de aquí en adelante.
Dim fila, columna As Integer
AxMSFlexGrid1.Rows = (Val(TextBoxnumdesubredes.Text)) + 1 "El número de filas en el FlexGrid será igual al número de redes más 1, pues se necesita una fila de encabezados.
AxMSFlexGrid1.Cols = 8 "Son ocho columnas y cada una con los siguientes encabezados: "Nombre de la red", "Dirección de red", "Máscara de subred", "Host inicial", "Host final", "Dirección de broadcast", "Hosts requeridos", "Hosts utilizables".
AxMSFlexGrid1.ForeColor = Color.DarkRed "Establece el color predeterminado de las letras.
With AxMSFlexGrid1 "Para no estar poniendo por ejemplo AxMSFlexGrid.set_ColWidth(0, 0) y así sucesivamente, no estar repitiendo a cada rato "AxMSFlexGrid1."
For columna2 As Integer = 0 To 7
.Row = 0 "Para que lo que se hace en este ciclo tenga efecto para la fila cero (que es la de encabezados).
.Col = columna2 "Para que se vaya avanzando de acuerdo con las iteraciones del ciclo For, en la columna que corresponda.
".set_ColAlignment(columna2, MSFlexGridLib.AlignmentSettings.flexAlignCenterCenter) "Se establece la alineación del contenido de la fila de encabezados.
.CellForeColor = Color.DarkBlue "Se establece el color de letra para la fila de encabezados.
.set_ColWidth(columna2, 1750) "Se establece el ancho de las celdas de la fila de encabezados.
Next
For fila1 As Integer = 1 To .Rows – 1 "Para no involucrar la primera fila, se comienza de 1 y no d 0.
.Row = fila1
For columna1 As Integer = 1 To .Cols – 1 "Para no involucrar la primera columna, se comienza de 1 y no de 0.
.Col = columna1
.CellForeColor = Color.DarkCyan "Por estar dentro del For anidado, cambia el color de letra de todas las celdas a azul oscuro (excepto la primera fila y la primera columna).
.set_ColWidth(columna1, 1750) "Por estar dentro del For anidado, le da un ancho de 1300 a cada columna (excepto a la primera columna).
".set_ColAlignment(columna1, MSFlexGridLib.AlignmentSettings.flexAlignLeftCenter) "Se establece la alineación a la derecha de todas las celdas.
Next
Next
"Se le ponen los respectivos títulos a cada columna.
.set_TextMatrix(0, 0, "Nombre de la red")
.set_TextMatrix(0, 1, "Dirección de red")
.set_TextMatrix(0, 2, "Máscara de subred")
.set_TextMatrix(0, 3, "Host inicial")
.set_TextMatrix(0, 4, "Host final")
.set_TextMatrix(0, 5, "Dirección de broadcast")
.set_TextMatrix(0, 6, "Hosts requeridos")
.set_TextMatrix(0, 7, "Hosts utilizables")
"Desde acá se programan las impresiones de los resultados del subneteo.
For fila2 As Integer = 1 To (Val(TextBoxnumdesubredes.Text))
.set_TextMatrix(fila2, 0, nombresubred(fila2)) "Nombres de las redes.
.set_TextMatrix(fila2, 1, Str(octeto1red(fila2)) & "." & Str(octeto2red(fila2)) & "." & Str(octeto3red(fila2)) & "." & octeto4red(fila2)) "Direcciones de las redes.
.set_TextMatrix(fila2, 2, "/" & mascarasubred(fila2)) "Máscaras de subredes.
.set_TextMatrix(fila2, 3, Str(octeto1red(fila2)) & "." & Str(octeto2red(fila2)) & "." & Str(octeto3red(fila2)) & "." & Str(Val(octeto4red(fila2)) + 1)) "Direcciones de los hosts iniciales utilizables de las subredes.
.set_TextMatrix(fila2, 4, Str(octeto1broadcast(fila2)) & "." & Str(octeto2broadcast(fila2)) & "." & Str(octeto3broadcast(fila2)) & "." & Str(Val(octeto4broadcast(fila2)) – 1)) "Direcciones de los hosts finales utilizables de las subredes.
".set_TextMatrix(fila2, 4, nombresubred(fila2)) "Direcciones de los hosts finales utilizables de las subredes.
.set_TextMatrix(fila2, 5, Str(octeto1broadcast(fila2)) & "." & Str(octeto2broadcast(fila2)) & "." & Str(octeto3broadcast(fila2)) & "." & octeto4broadcast(fila2)) "Direcciones de broadcast de las subredes.
.set_TextMatrix(fila2, 6, numerodehosts(fila2)) "Número de hosts requeridos.
.set_TextMatrix(fila2, 7, Str(Val(2 ^ (32 – Val(mascarasubred(fila2)))) – 2)) "Número de hosts utilizables.
Next
End With
Next
"TextBox1.Text = mascara(Val(numerodehosts(1)))
"TextBox1.Text = mascarasubred(1)
"TextBox2.Text = mascarasubred(2)
"TextBox3.Text = mascarasubred(3)
"TextBox4.Text = mascarasubred(4)
"TextBox5.Text = mascarasubred(5)
"TextBox6.Text = mascarasubred(6)
"TextBox7.Text = mascarasubred(7)
"TextBox8.Text = mascarasubred(8)
"TextBox9.Text = mascarasubred(9)
"TextBox1.Text = Str(octeto1red(1)) & "." & Str(octeto2red(1)) & "." & Str(octeto3red(1)) & "." & octeto4red(1)
"TextBox2.Text = Str(octeto1red(2)) & "." & Str(octeto2red(2)) & "." & Str(octeto3red(2)) & "." & octeto4red(2)
"TextBox3.Text = Str(octeto1red(3)) & "." & Str(octeto2red(3)) & "." & Str(octeto3red(3)) & "." & octeto4red(3)
"TextBox4.Text = Str(octeto1red(4)) & "." & Str(octeto2red(4)) & "." & Str(octeto3red(4)) & "." & octeto4red(4)
"TextBox5.Text = Str(octeto1red(5)) & "." & Str(octeto2red(5)) & "." & Str(octeto3red(5)) & "." & octeto4red(5)
"TextBox6.Text = Str(octeto1red(6)) & "." & Str(octeto2red(6)) & "." & Str(octeto3red(6)) & "." & octeto4red(6)
"TextBox7.Text = Str(octeto1red(7)) & "." & Str(octeto2red(7)) & "." & Str(octeto3red(7)) & "." & octeto4red(7)
"TextBox8.Text = Str(octeto1red(8)) & "." & Str(octeto2red(8)) & "." & Str(octeto3red(8)) & "." & octeto4red(8)
"TextBox9.Text = Str(octeto1red(9)) & "." & Str(octeto2red(9)) & "." & Str(octeto3red(9)) & "." & octeto4red(9)
End If
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
"TextBoxocteto1.Focus() "Para posicionar el cursor en el TextBoxocteto1 cuando se cargue el formulario.
End Sub
Private Sub Buttonlimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonlimpiar.Click
With AxMSFlexGrid1
For fila As Integer = 0 To .Rows – 1
.Row = fila
For columna As Integer = 0 To .Cols – 1
.set_TextMatrix(fila, columna, "") "Por estar dentro de los For anidados, con esto se ponen valores String Empty en todas las celdas, de modo que no aparezca nada y queden todas las celdas limpias y sin resultados de cálculos hechos anteriormente.
Next
Next
End With
TextBoxocteto1.Text = ""
TextBoxocteto2.Text = ""
TextBoxocteto3.Text = ""
TextBoxocteto4.Text = ""
TextBoxmascara.Text = ""
TextBoxnumdesubredes.Text = ""
TextBoxipsrequeridas.Text = ""
TextBoxipsdisponibles.Text = ""
TextBoxipsenredoriginal.Text = ""
TextBoxporcentajetotalreservado.Text = ""
TextBoxporcentajesubneteadoreservado.Text = ""
End Sub
End Class
Código en Modulemetodospublicos.vb
Module Modulemetodospublicos
'Teniendo ordenadas las subredes de mayor a menor (en base a la cantidad de hosts de cada subred), se comienza a subnetear.
'Public bandera As Boolean = True
'Public potencia As Integer = 0
'Public subindice As Integer = 1
Public Function mascara(ByVal numerodehost As Integer) As Integer
Dim bandera As Boolean = True
Dim potencia As Integer = 0
While bandera = True
If ((2 ^ potencia) – 2) > (numerodehost) Then
bandera = False
potencia -= 1
End If
potencia += 1
End While
mascara = 32 – potencia 'Los 32 bits que componen los cuatro octetos de IPv4 menos el número de bits que se usarán para hosts (que se almacena en la variable "potencia").
If numerodehost = 2 Then 'Porque con el proceso anterior, si el parámetro "numerodehost" valiera 2, entonces la máscara daría 29 con los cálculos anteriores, lo cual sería incorrecto.
mascara = 30
End If
End Function
End Module
Programa en Ejecución
Si se introducen valores inválidos, aparecerá el siguiente mensaje:
Hacer clic en Subnetear luego de introducir la dirección IP y la máscara de subred, así como también el número de subredes. Aparecerá entonces la ventana emergente para introducir los nombres de cada una de las subredes y el número de hosts para cada una de dichas subredes:
El programa realiza el subneteo VLSM correspondiente, y los resultados son los siguientes:
Igualmente se puede realizar el subneteo para más redes, tantas como se necesite o desee, y si las redes son tantas que no se alcanzan a visualizar todas en la pantalla, la respectiva barra de desplazamiento aparecerá automáticamente para navegar en la tabla de resultados. El programa presenta también resultados del subneteo, incluyendo hosts requeridos, hosts disponibles en espacio subneteado, hosts disponibles en red original, porcentaje de espacio total reservado y porcentaje de espacio subneteado utilizado. Al hacer clic en el botón Limpiar, todos los resultados desaparecen y se pueden introducir nuevos valores para un nuevo subneteo. Los resultados del programa se comparan con los generados mediante el sitio web http://www.vlsm-calc.net/, y se comprueba que los resultados son exactamente los mismos:
Autor:
Jaime Montoya
28 de noviembre de 2008
Huntsville, Alabama, USA
Página anterior | Volver al principio del trabajo | Página siguiente |