Page 1 sur 1
[R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 21:16
par Utilisateur 3309 supprimé
Bonjour,
je ne parviens pas a faire une fonction qui me permettrai d'obtenir
l'ip de broadcast dans la mesure ou je connais mon IP et mon masque de sous réseau.
le calcul est expliqué ici:
https://openclassrooms.com/forum/sujet/ ... ge-5421031
Merci pour votre aide.

Re: [..] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:02
par jguinch
C'est une demande de script, ou tu veux juste de l'aide ?
Ou bloques-tu ?
Re: [..] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:12
par Utilisateur 3309 supprimé
ben c'est un peu les deux, je ne suis pas sur de partir dans la bonne direction, voilà ce que j'ai a ce stade :
J'ai réussi pour l'ip et le masque a convertir le décimal vers le binaire. Là ca me parait un peut fastidieux à partir de ca d'arriver au résultat final donc j'ai l'impression de partir dans la mauvaise voie.
► Afficher le texte
Code : Tout sélectionner
#include "Array.au3"
$sIP = "192.168.0.10"
$sMASK = "255.255.0.0"
$aIP = StringSplit($sIP, ".")
$aMASK = StringSplit($sMASK, ".")
$aIP[1] = _DecToBinary($aIP[1])
$aIP[2] = _DecToBinary($aIP[2])
$aIP[3] = _DecToBinary($aIP[3])
$aIP[4] = _DecToBinary($aIP[4])
$aMASK[1] = _DecToBinary($aMASK[1])
$aMASK[2] = _DecToBinary($aMASK[2])
$aMASK[3] = _DecToBinary($aMASK[3])
$aMASK[4] = _DecToBinary($aMASK[4])
_ArrayDisplay($aMASK)
; Decimal To Binary
Func _DecToBinary($iDec)
Local $i, $sBinChar = ""
If StringRegExp($iDec, '[[:digit:]]') Then
$i = 1
Do
$x = 16 ^ $i
$i += 1
; Determine the Octets
Until $iDec < $x
For $n = 4 * ($i - 1) To 1 Step -1
If BitAND(2 ^ ($n - 1), $iDec) Then
$sBinChar &= "1"
Else
$sBinChar &= "0"
EndIf
Next
if stringlen($sBinChar) = 4 then $sBinChar = "0000" & $sBinChar
Return $sBinChar
Else
MsgBox(0, "Error", "Wrong input, try again ...")
Return
EndIf
EndFunc ;==>_DecToBinary
Re: [..] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:19
par jguinch
Pas besoin de convertir en binaire pour utiliser les opérateurs logiques.
En partant de ça :
https://www.autoitscript.com/forum/topi ... ment=55539
► Afficher le texte
Code : Tout sélectionner
Local $broadcast = _BroadcastIPCalc("192.168.1.10", "255.255.255.0")
MsgBox(0, "", $broadcast)
Func _BroadcastIPCalc($sIP, $sMask)
If NOT _IPv4_IsValide($sIP) OR NOT _IPv4_IsValide($sMask) Then Return SetError(1, 0, 0)
Local $aIP = StringSplit($sIP, "."), $aMask = StringSplit($sMask, ".")
Local $aCalc[5][2], $sBroadcastAddr
For $i = 1 To $aIP[0]
$aCalc[$i][0] = BitAND($aIP[$i], $aMask[$i])
$aCalc[$i][1] = BitNOT($aMask[$i] - 256)
$sBroadcastAddr &= ($i = 1 ? "" : ".") & BitOR($aCalc[$i][0], $aCalc[$i][1])
Next
Return $sBroadcastAddr
EndFunc
Func _IPv4_IsValide($sIP)
Return StringRegExp($sIP, "^(?:(?:(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?1))$")
EndFunc
Re: [..] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:23
par Utilisateur 3309 supprimé
Tu m'as tué là...
Je savais bien que ce n'était pas normal de produire autant de code pour faire ça...
Merci beaucoup !

Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:28
par jguinch
Et encore, c'est la version longue...

Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:47
par jchd
Oui, si on omet la validation :
Code : Tout sélectionner
Local $IP = '192.168.27.83'
Local $mask = '255.255.240.0'
ConsoleWrite(_BroadcastAddr($IP, $mask) & @LF)
Func _BroadcastAddr($sIP, $sMask)
Local $aIP = StringSplit($sIP, ".", 2)
Local $aMask = StringSplit($sMask, ".", 2)
Local $sBroadcast
For $i = 0 To 3
$sBroadcast &= BitOR($aIP[$i], BitAND(BitNOT($aMask[$i]), 0xFF)) & "."
Next
Return StringTrimRight($sBroadcast, 1)
EndFunc
Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 22:58
par jguinch
► Afficher le texte
Code : Tout sélectionner
Local $broadcast = _BroadcastIPCalc("192.168.1.10", "255.255.255.0")
MsgBox(0, "", $broadcast)
Func _BroadcastIPCalc($sIP, $sMask)
Local $sRet = StringRegExpReplace($sIP & "." & $sMask, "^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.((?1))\.((?1))\.((?1))\.((?1))\.((?1))\.((?1))\.((?1))$", "BitOR($1, BitXOR($5, 0xFF)) & '.' & BitOR($2, BitXOR($6, 0xFF)) & '.' & BitOR($3, BitXOR($7, 0xFF)) & '.' & BitOR($4, BitXOR($8, 0xFF))")
Return (@extended ? Execute($sRet) : SetError(1, 0, 0) )
EndFunc

Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 23:00
par mikell
?
Code : Tout sélectionner
$sBroadcast &= BitOR($aIP[$i], BitXOR($aMask[$i], 0xFF)) & "."
Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 23:10
par jguinch
T'as l'oeil mikell !
Je suis passé à côté de ça

Re: [R] Calculer l'ip de broadcast
Posté : dim. 06 sept. 2015 23:18
par jchd
Heureusement que tu n'as pas à nous faire la même en IPv6
Re: [R] Calculer l'ip de broadcast
Posté : jeu. 10 sept. 2015 13:13
par Utilisateur 3309 supprimé
Bonjour,
je reviens vers vous concernant l'envoi d'un paquet UDP sur
255.255.255.255, ca ne marche pas chez moi, je suis en v3.3.14.1
avec SmartSniff sur mon PC je ne vois aucun paquet sortir. j'ai fait quelques recherches et j'ai trouver ceci:
https://www.autoitscript.com/forum/topi ... esnt-work/
et cela nous mene a ce rapport de Bug:
https://www.autoitscript.com/trac/autoit/ticket/938
et visiblement cela a été corrigé depuis la V3.3.1.1
Mais chez moi cela ne marche pas, et ce n'est pas un problème avec mon PC ou ma carte réseau car avec
WakeMeOnLan j'arrive a envoyer un paquet WOL sur 255.255.255.255, que je vois bien sortir de mon PC avec smartsniff, et qui démarre bien le PC ciblé.
voici mon code:
► Afficher le texte
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icone.ico
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Res_Fileversion=1.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$aArray = _IPDetails()
Global $LIVEBOX = $aArray[3]
Global $MASK = $aArray[4]
Global $IPBroadcast = _BroadcastIPCalc($LIVEBOX, $MASK)
Global $sDevice_list = ""
Global $sMenu = ""
Global $sDefaut_device = ""
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Wake On Lan", 306, 88, 365, 267)
$Combo1 = GUICtrlCreateCombo("", 8, 16, 289, 25, $CBS_DROPDOWNLIST)
$Button1 = GUICtrlCreateButton("Réveiller !", 224, 48, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
Device_list()
GUICtrlSetData($Combo1, $sMenu, $sDefaut_device)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$sDevice = GUICtrlRead($Combo1)
$aMAC = StringSplit($sDevice, "/")
$MACAddress = StringReplace($aMAC[2], " ", "") ; on enelève les espaces
$MACAddress = StringReplace($MACAddress, ":", "") ; on enelève les :
UDPStartup()
$connexion = UDPOpen($IPBroadcast, 7)
$res = UDPSend($connexion, GenerateMagicPacket($MACAddress))
;MsgBox(0, "", "Paquet envoyé")
UDPCloseSocket($connexion)
UDPShutdown()
EndSwitch
WEnd
; Conversion Hexa vers Char
Func HexToChar($strHex)
Return Chr(Dec($strHex))
EndFunc ;==>HexToChar
; Fonction pour générer le "Paquet magique"
Func GenerateMagicPacket($strMACAddress)
$MagicPacket = ""
$MACData = ""
For $p = 1 To 11 Step 2
$MACData = $MACData & HexToChar(StringMid($strMACAddress, $p, 2))
Next
For $p = 1 To 6
$MagicPacket = HexToChar("ff") & $MagicPacket
Next
For $p = 1 To 16
$MagicPacket = $MagicPacket & $MACData
Next
Return $MagicPacket
EndFunc ;==>GenerateMagicPacket
Func Device_list()
If LB_type() = "lbv3fr" Then ; Livebox 3
$PARAMS = '{"parameters":{"expression":".Active==false","traverse":"down","flags":""}}'
;$PARAMS = '{"parameters":{}}'
$oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/Devices:get", False)
$oHTTP.Send($PARAMS)
$sDevice_list = $oHTTP.ResponseText
$aDevices = StringRegExp($sDevice_list, '(?>"Key":"([^"]*)")(?>.*?Name":"([^"]*)")(?>.*?"Active":([^,]*))(?>.*?Layer2Interface":"([^"]*)")', 3)
ElseIf LB_type() = "lbv2fr" Then ; Livebox 2
$PARAMS = '{"parameters":{}}'
$oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/Hosts:getDevices", False)
$oHTTP.Send($PARAMS)
$sDevice_list = $oHTTP.ResponseText
$aDevices = StringRegExp($sDevice_list, '(?>"physAddress":"([^"]*)")(?>.*?hostName":"([^"]*)")(?>.*?"active":([^,]*))(?>.*?layer2Interface":"([^"]*)")', 3)
EndIf
If IsArray($aDevices) Then
For $i = 0 To UBound($aDevices) - 1 Step 4
If $aDevices[$i + 2] = "false" And $aDevices[$i + 3] = "eth0" Then
;If $aDevices[$i + 3] = "eth0" Then
If $sDefaut_device = "" Then
$sDefaut_device = $aDevices[$i + 1] & " / " & $aDevices[$i]
EndIf
$sMenu &= $aDevices[$i + 1] & " / " & $aDevices[$i] & "|"
EndIf
Next
EndIf
EndFunc ;==>Device_list
Func LB_type()
$oHTTP.Open("GET", "http://" & $LIVEBOX, False)
$oHTTP.Send()
$return = $oHTTP.ResponseText
$aModel = StringRegExp($return, "BUILD_PROJECT: '(.*?)',", 3)
If IsArray($aModel) Then
$sModel = $aModel[0]
Else
MsgBox(48, "ERREUR", "Model de Livebox inconnu")
Exit
EndIf
Return $sModel
EndFunc ;==>LB_type
Func _IPDetails()
Local $oWMIService = ObjGet('winmgmts:{impersonationLevel = impersonate}!\\' & '.' & '\root\cimv2')
Local $oColItems = $oWMIService.ExecQuery('Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True', 'WQL', 0x30), $aReturn[5] = [0]
If IsObj($oColItems) Then
For $oObjectItem In $oColItems
;If $oObjectItem.IPAddress(0) == @IPAddress1 Then
If $oObjectItem.DefaultIPGateway(0) <> '' Then
$aReturn[0] = 5
$aReturn[1] = $oObjectItem.IPAddress(0)
$aReturn[2] = $oObjectItem.MACAddress
$aReturn[3] = $oObjectItem.DefaultIPGateway(0)
$aReturn[4] = $oObjectItem.IPSubnet[0]
EndIf
Next
EndIf
Return SetError($aReturn[0] = 0, 0, $aReturn)
EndFunc ;==>_IPDetails
Func _BroadcastIPCalc($sIP, $sMask)
If NOT _IPv4_IsValide($sIP) OR NOT _IPv4_IsValide($sMask) Then Return SetError(1, 0, 0)
Local $aIP = StringSplit($sIP, "."), $aMask = StringSplit($sMask, ".")
Local $aCalc[5][2], $sBroadcastAddr
For $i = 1 To $aIP[0]
$aCalc[$i][0] = BitAND($aIP[$i], $aMask[$i])
$aCalc[$i][1] = BitNOT($aMask[$i] - 256)
$sBroadcastAddr &= ($i = 1 ? "" : ".") & BitOR($aCalc[$i][0], $aCalc[$i][1])
Next
Return $sBroadcastAddr
EndFunc
Func _IPv4_IsValide($sIP)
Return StringRegExp($sIP, "^(?:(?:(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?1))$")
EndFunc
Le but de celui-ci est de récupérer dans un menu déroulant la liste des équipements innactifs de ma LiveBox. et donc de les redémarrer en envoyant un paquet magique.
Donc jusque là je
calculais l'ip de broadcast du sous réseau, jusqu'à ce que j'apprenne que "je me faisait des nœuds au cerveau" et qu'un simple envoi du paquet magique sur
255.255.255.255 fonctionnait.
J'ai vérifié avec WakeMeOnLan et c'est vrai, mais dans mon script si je remplace à la ligne 48:
par:
et bien cela ne fonctionne pas, aucune erreur n'est renvoyée et aucun paquet ne sort de l'application.
Re: [R] Calculer l'ip de broadcast
Posté : jeu. 10 sept. 2015 19:34
par jchd
Vu l'aide de UDPOpen, ça me semble normal. Si tu essayais de mettre le flag à 1 (ou $UDP_OPEN_BROADCAST le bien nommé) ?
Re: [R] Calculer l'ip de broadcast
Posté : jeu. 10 sept. 2015 20:33
par Utilisateur 3309 supprimé
je crois que je mérite le fouet...
Merci jchd
Re: [R] Calculer l'ip de broadcast
Posté : jeu. 10 sept. 2015 21:36
par orax
Re: [R] Calculer l'ip de broadcast
Posté : ven. 11 sept. 2015 00:48
par jchd
Le fouet ? Bah tu te l'infliges tout seul, alors pourquoi se fatiguer ?
