Problem mit UDPOpen (Magic-Paket)

  • Hallo Zusammen,

    ich habe mit dem nachfolgenden Script Probleme - aber nur auf gewissen Computern. Bei manchen läuft es! (Leider konnte ich keine Regelmässigkeit feststellen)
    Das Problem ist, dass das Script als AU3 funktioniert! Kein Fehler, alles I.O!
    Wenn ich es als EXE kompilliere, funktioniert es nicht mehr!

    Hier der Code:

    Spoiler anzeigen
    [autoit]

    Dim Const $MAC = "XXXXXXXXXXXX"
    Dim Const $PCName = "PCNamen"
    Dim $Broadcast, $IP, $BroadcastIP, $Error

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()
    $IP = TCPNameToIP($PCName)
    TCPShutdown()

    [/autoit] [autoit][/autoit] [autoit]

    If $IP = "" Then
    $BroadcastIP = "255.255.255.255"
    Else
    $BroadcastIP = StringLeft($IP, StringInStr($IP, ".", 0, -1)) & "255"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    UDPStartup()
    $Broadcast = UDPOpen($BroadcastIP, 9, 1)
    MsgBox(0,"","UDP-Error: " & @error)
    $ReturnValue = UDPSend($Broadcast, _MagicPacket($MAC))
    $Error = @error
    UDPCloseSocket($Broadcast)
    UDPShutdown()

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", "PC-Namen: " & $PCName & @LF & "IP: " & $IP & @LF & "IP-Broadcast: " & $BroadcastIP & @LF & "UDP Bytes gesendet: " & $ReturnValue & @LF & "UDP Error-Message: " & $Error)

    [/autoit] [autoit][/autoit] [autoit]

    Func _MagicPacket($sMac)
    If Not IsBinary($sMac) Then $sMac = Binary('0x' & StringRegExpReplace($sMac,'(0x)|[^A-Za-z0-9]', ''))
    Local $binPacket = Binary('0xFFFFFFFFFFFF')
    For $i = 1 To 16
    $binPacket &= $sMac
    Next
    Return $binPacket
    EndFunc

    [/autoit]

    In AU3 ist die erste Messagebox = 0 (Kein UDP Fehler)
    Und bei der zweiten werden 102 Bytes gesendet. Alles korrekt.

    Wenn ich es als EXE kompilliere und ausführe, ist die erste Messagebox 10022!
    Bei der zweiten werden 0 Bytes gesendet und die UDP Error-Message ist auf -2.

    Woran könnte das liegen?

    Einmal editiert, zuletzt von veronesi (1. Juli 2011 um 13:11)

  • ka

    aber das klappt bei mir sowohl kompiliert wie auch in der IDE, ein Teil aus dem Script rausgerupft :)

    [autoit]


    ....
    Case $Btn_Wake_Clients ; Aktion - Wecken der Clientauswahl
    If GUICtrlRead($Chb_Wake_Remote) = 1 Then
    If GUICtrlRead($Cbo_Wake_WolMC) = "Bitte Router auswählen" Then
    _Show_Info_Msg("Achtung:","Es wurde kein Router ausgewählt")
    Else
    $Lbx_Items = _GUICtrlListBox_GetSelItemsText($Lbx_Wake_Clients)
    For $i_lbx_cnt = 1 To $Lbx_Items[0]
    $a_Client = IniReadSection($f_Wol_Ini,$Lbx_Items[$i_lbx_cnt])
    ;~_Show_Info_Msg("Achtung:","sbin wol remote auf Router")
    _Show_Info_Msg("Info:", $a_Client[1][1] & " wird remote geweckt.")
    Next
    EndIf
    Else
    $Lbx_Items = _GUICtrlListBox_GetSelItemsText($Lbx_Wake_Clients)
    For $i_lbx_cnt = 1 To $Lbx_Items[0]
    $a_Client = IniReadSection($f_Wol_Ini,$Lbx_Items[$i_lbx_cnt])
    UDPStartUp()
    $Wol_Con = UDPOpen($a_Client[4][1], 7)
    $res = UDPSend($Wol_Con, _Generate_Magic_Packet($a_Client[2][1]))
    _Show_Info_Msg("Info:", $a_Client[1][1] & " wird geweckt.")
    UDPCloseSocket($Wol_Con)
    UDPShutdown()
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ....

    [/autoit][autoit][/autoit][autoit]

    Func _Hex_To_Char($strHex) ; Konvertiere MAC-Adresse
    Return Chr(Dec($strHex))
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _Generate_Magic_Packet($strMACAddress) ; Generiere "Magic Packet"
    $MagicPacket = ""
    $MACData = ""
    For $p = 1 To 11 Step 2
    $MACData = $MACData & _Hex_To_Char(StringMid($strMACAddress, $p, 2))
    Next
    For $p = 1 To 6
    $MagicPacket = _Hex_To_Char("ff") & $MagicPacket
    Next
    For $p = 1 To 16
    $MagicPacket = $MagicPacket & $MACData
    Next
    Return $MagicPacket
    EndFunc

    [/autoit]

    [4][1] ist übrigens die BC-Adresse

    [VDR01]
    PC-Name=vdr01
    MAC-Adresse=00348CB2E019
    IP-Adresse=192.168.123.11
    Broadcast=192.168.123.255
    Fernzugriff=SSH
    WOL-Router=Home
    Tunnel-Config=SSH_VDR1
    User=root
    Pass=EEAAA5BCFDB5D652ADF85253ACFDB5D652ADF8136CFDB5D652ADF8588D124F34DCFDB5D652ADF80537C3

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (1. Juli 2011 um 13:12)

  • Hallo Dietmar,


    wenn ich meine Magic Packet funktion durch Deine ersetzte (inkl. der _Hex_To_Char) dann funktioniert das Ganze!
    Keine Ahnung warum!!!

    Eine Idee?
    Danke!

  • Nein, Irrtum.
    Das funktionierte auch nicht.

    Aber nun habe ich die Lösung gefunden:
    Ich habe die EXE immer vom Netzlaufwerk aus ausgeführt. Dann geht es nicht!!!!
    (Beide Varianten)

    Aber wenn ich die EXE lokal kopiere, dann funktioniert es! (Beide Varianten!!)

    Keine Ahnung warum, aber es ist so!
    Danke!

  • Mal ein paar Fragen bzw. mögliche Fehlerquellen:

    1. Funktioniert das Script auf den problematischen Rechnern auch als au3? Aus deiner Beschreibung geht nicht ganz hervor ob es überall als au3 getestet wurde oder nur auf (d)einem Rechner, welcher über mehr Rechte verfügt.
    2. Funktioniert die IP Ermittlung auf den problematischen Rechnern? ($IP=...)
    3. Bist du sicher, dass auf allen Rechnern gleich große Netze zum Einsatz kommen und das letzte Oktett für dir Broadcast IP immer 255 sein muss? Kleinere Netze könnten beispielweise auch die 127 haben usw.
    4. Die Firewall könnte ggf. eine Ausnahme für den Sciteditor haben, jedoch alle anderen EXE Dateien blockieren, auch hier solltest du prüfen ob udp Verbindungen über den Port 9 überall möglich sind, ggf. Ausnahmen für deine Script.exe erstellen.

    EDIT: Na dann hat sich das ja erledigt


  • 1. Funktioniert das Script auf den problematischen Rechnern auch als au3? Aus deiner Beschreibung geht nicht ganz hervor ob es überall als au3 getestet wurde oder nur auf (d)einem Rechner, welcher über mehr Rechte verfügt.

    Ja, das AU3 funktioniert auf ALLEN Rechnern. Und es ist auch egal ob es von einem Netzlaufwerk oder lokal ausgeführt wird.


    2. Funktioniert die IP Ermittlung auf den problematischen Rechnern? ($IP=...)


    Ja, die funktioniert auf allen Rechnern und mit AU3 sowie auch mit EXE!


    3. Bist du sicher, dass auf allen Rechnern gleich große Netze zum Einsatz kommen und das letzte Oktett für dir Broadcast IP immer 255 sein muss? Kleinere Netze könnten beispielweise auch die 127 haben usw.


    Ja, 255 stimmt in jedem Fall (bei mir)


    4. Die Firewall könnte ggf. eine Ausnahme für den Sciteditor haben, jedoch alle anderen EXE Dateien blockieren, auch hier solltest du prüfen ob udp Verbindungen über den Port 9 überall möglich sind, ggf. Ausnahmen für deine Script.exe erstellen.


    Habe ich soeben getestet. Port 7 und Port 9 werden NICHT geblockt.

    Immerhin läuft es nun ja. Damit kann ich vorläufig leben!

  • Hmm gute Idee, doch leider stimmt das auch nicht.
    Einige, welche ich getestet habe, haben bloss eine Netzwerkkarte und es läuft trotzdem nicht.
    Dafür läuft es auf einem (Server), welcher 8 Netzwerkkarten hat.....

  • Ich war etwas ungenau. Ich hab die Erfahrung gemacht, dass es immer geht, egal wieviel Netzwerkkarten, wenn das OS Windows XP ist. Ist Vista oder Win 7 drauf und mehr als eine Netzwekkarte, dann funktionierte mein Testscript damals auch nicht, außer ich habe alle, bis auf die betreffende Netzwerkkarte, deaktiviert.

    happy computing
    R@ienr

  • Ich hab damals viel Zeit verbraten, um das zu untersuchen. Letztendlich war es auch ein Bug in AutoIt und ProgAndy hat mir damals ne Alternative programmiert, bis dann mein Bug-Report erhört wurde, und als Resultat dann die Option "flag" :1 - Allow the broadcasting on the address "255.255.255.255" eingeführt wurde. Trotzdem habe ich es nie auf allen Rechnern zum Laufen gebracht, außer der Workaround, alle nicht benötigten Netzwerkkarten zu deaktivieren.

    Mit wireshark siehst Du ziemlich schnell, wo das Problem liegt.

    happy computing
    R@iner