Récupérer adresse ip + masque de sous-réseau (subnet mask) pour calculer l'adresse ip broadcast (.net 2.0)

Contenu du snippet

En quelques étapes simple, ce bout de code .NET permet de récupérer l'adresse ip de la machine et le masque de sous-réseau afin de calculer l'adresse IP de Broadcast (qui réfère à tous les postes du même sous-réseau).

Le calcul semble bon si je me fie à plusieurs sites permettant de calculer l'adresse broadcast en ligne.

Pour la théorie, je l'ai prise là : http://www.shunsoft.net/ipcalc/helpfr/chap07.html

Techniques utilisées :
- Lecture dans le registre Windows
(Microsoft.Win32.RegistryKey) afin de savoir le masque de sous-réseau
- Utilisation de l'objet System.Net.Dns pour requeillir l'adresse IP de la machine locale
- Utilisation de l'objet System.Net.IPAddress

'Exemple d'utilisation
Console.WriteLine("Adresse de broadcast locale = " & _
cBroadcast.GetBroadcastIP.ToString())

Debug.WriteLine("Masque de sous réseau local = " & _
cBroadcast.GetSubnetMaskFromRegistry.ToString())

Dim ip As IPAddress = _
IPAddress.Parse("192.168.0.100")
Dim subMask As IPAddress = _
IPAddress.Parse("255.255.255.0")

Console.WriteLine("Adresse de broadcast calculée = " & _
cBroadcast.GetBroadcastIP(ip, _
subMask).ToString())

Source / Exemple :


Imports System.Net
Imports System.Net.Sockets
Imports Microsoft.Win32

Public Class cBroadcast

  Private Const NULL_IP As String = "0.0.0.0"

  ''' <summary>
  ''' Récupère le subnetmask dans la base de registre.
  ''' Si rien trouvé, retourne "255.255.255.0"
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public Shared Function GetSubnetMaskFromRegistry() As IPAddress
    Dim OurKey As RegistryKey = Registry.LocalMachine
    'ouvre la clé ou sont définit les interfaces tcpip
    OurKey = OurKey.OpenSubKey("SYSTEM\CurrentControlSet\" & _
                               "Services\Tcpip\Parameters\Interfaces", _
                               False)

    Dim sSubMask As String = ""

    For Each sKey As String In OurKey.GetSubKeyNames
      'parcourt les clés à la recherche d'une ayant 
      'une adresse ip de définie
      Dim SubKey As RegistryKey = OurKey.OpenSubKey(sKey, False)
      'vérifie si en DHCP
      If CInt(SubKey.GetValue("EnableDHCP")) = 1 Then
        If KeyIsOk("DhcpDefaultGateway", SubKey) Then
          If KeyIsOk("DhcpIPAddress", SubKey) Then
            If KeyIsOk("DhcpSubnetMask", SubKey) Then
              sSubMask = CStr(SubKey.GetValue("DhcpSubnetMask", NULL_IP))
            End If
          End If
        End If
      Else
        'si on n'utilise pas DHCP
        If KeyIsOk("SubnetMask", SubKey) Then
          sSubMask = CStr(SubKey.GetValue("SubnetMask", NULL_IP)(0))
        End If
      End If
      If sSubMask <> "" Then Exit For
    Next

    Dim ipResult As IPAddress

    '======================================
    'Validation à améliorer...
    'si aucun trouvé, on fait quoi?
    '======================================
    If sSubMask = "" Then
      ipResult = IPAddress.Parse("255.255.255.0")
    Else
      Try
        ipResult = IPAddress.Parse(sSubMask)
      Catch ex As Exception
        ipResult = IPAddress.Parse("255.255.255.0")
      End Try
    End If

    Return ipResult
  End Function

  Private Shared Function KeyIsOk(ByVal Key As String, ByRef SubKey As RegistryKey) As Boolean
    Dim bret As Boolean
    If TypeOf (SubKey.GetValue(Key, NULL_IP)) Is String AndAlso CStr(SubKey.GetValue(Key, NULL_IP)) <> NULL_IP Then bret = True
    Return bret
  End Function

  ''' <summary>
  ''' Calcule et retourne l'adresse de broadcast du réseau local
  ''' </summary>
  ''' <returns>Adresse de broadcast du sous-réseau local</returns>
  ''' <remarks></remarks>
  Public Shared Function GetBroadcastIP() As IPAddress
    'retreive computer IP address
    Dim IP_Address As System.Net.IPAddress = _
        Dns.GetHostEntry(Dns.GetHostName).AddressList(0)
    'read subnet mask from registry
    Dim SubnetMask As System.Net.IPAddress = GetSubnetMaskFromRegistry()
    'get broadcast IP
    Dim ipResult As IPAddress = GetBroadcastIP(IP_Address, SubnetMask)
    Return ipResult
  End Function

  ''' <summary>
  ''' Calcule et retourne l'adresse de broadcast d'un sous-réseau
  ''' </summary>
  ''' <param name="IP_Address">Adresse IP appartenant au sous réseau</param>
  ''' <param name="SubnetMask">Sous-réseau hébergeant l'adresse IP</param>
  ''' <returns>Adresse de broadcast du sous-réseau</returns>
  ''' <remarks></remarks>
  Public Shared Function GetBroadcastIP(ByVal IP_Address As System.Net.IPAddress, _
                                        ByVal SubnetMask As System.Net.IPAddress) _
                                        As System.Net.IPAddress
    Dim ipResult As IPAddress
    'calculate subnet IP from Computer IP and subnet mask
    Dim SubnetIP As IPAddress = GetSubnetIP(IP_Address, SubnetMask)
    'invert bytes of subnet mask
    SubnetMask = GetInverted(SubnetMask)
    'get broadcast IP from subnet IP and subnet mask
    ipResult = CalcBroadcast(SubnetIP, SubnetMask)
    Return ipResult
  End Function

  Private Shared Function GetInverted(ByVal IP_Address As System.Net.IPAddress) _
                                      As IPAddress
    Dim bytIP() As Byte = IP_Address.GetAddressBytes
    For i As Integer = 0 To 3
      bytIP(i) = bytIP(i) Xor 255
    Next
    Return New IPAddress(bytIP)
  End Function

  Private Shared Function CalcBroadcast(ByVal SubnetIP As System.Net.IPAddress, _
                                       ByVal SubnetMask As System.Net.IPAddress) _
                                       As System.Net.IPAddress
    Dim subNetIpBytes() As Byte = SubnetIP.GetAddressBytes()
    Dim subMaskBytes() As Byte = SubnetMask.GetAddressBytes()
    Dim ResultBytes(3) As Byte

    For i As Integer = 0 To 3
      ResultBytes(i) = subNetIpBytes(i) Xor subMaskBytes(i)
    Next

    Return New System.Net.IPAddress(ResultBytes)
  End Function

  Public Shared Function GetSubnetIP(ByVal IP_Address As System.Net.IPAddress, _
                                     ByVal SubnetMask As System.Net.IPAddress) _
                                     As System.Net.IPAddress
    Dim ipBytes() As Byte = IP_Address.GetAddressBytes()
    Dim subMaskBytes() As Byte = SubnetMask.GetAddressBytes()
    Dim ResultBytes(3) As Byte

    For i As Integer = 0 To 3
      ResultBytes(i) = ipBytes(i) And subMaskBytes(i)
    Next

    Return New System.Net.IPAddress(ResultBytes)
  End Function

End Class

Conclusion :


Testé sur Win XP Home...

Si quelque s'un d'entre vous avait la chance de tester sur différentes plateformes, j'apprécierait recevoir des feedback a savoir si ca roule par exemple sur XP Pro, 2000, NT
(à savoir si l'emplacement est le même dans le registre)
Je n'ai pas testé localement non plus avec des restrictions de lecture dans le registre (compte usager Windows limité)... (Feedback demandé svp...)

Reste à améliorer la validation des adresse IP

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.