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
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.