WoL/MagicPacket Windows vs. Linux Problem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

Grüße,

ich habe mal wieder ein Problem. Folgender Code funktioniert unter Win7 32Bit/64Bit mit PB5.31 x86/x64 ... das Packet wird erzeugt, versendet und weckt den angegebenen Rechner auf. Allerdings funktioniert unter Windows nicht "255.255.255.255" (die Verbindung kann nicht geöffnet werden), aber das eigene Subnet reicht mir :wink:

unter Linux Ubuntu 14.04/amd64 und 14.10/i386 mit PB 5.31 x86/x64 geht gar nichts, d.h. er sendet kein einziges Byte.

Weiß jemand Rat?

Code: Alles auswählen

Structure MacAddress
  Byte.b[6]
EndStructure

Structure MagicPacket
  Header.b[6]
  Mac.MacAddress[16]
EndStructure

Structure MacAdress_Stringfields
  Byte1.s{2}
  Seperator1.s{1}
  Byte2.s{2}
  Seperator2.s{1}
  Byte3.s{2}
  Seperator3.s{1}
  Byte4.s{2}
  Seperator4.s{1}
  Byte5.s{2}
  Seperator5.s{1}
  Byte6.s{2}
EndStructure

Structure MacAddress_String
  StructureUnion
    Stringfields.MacAdress_Stringfields
    Mac.s{17}
  EndStructureUnion
EndStructure

; *dest = Address with MacAddress-Structure
; Mac.s = MacAddress (11:22:33:44:55:66 or 11-22-33-44-55-66)
Procedure createMacAdress(*Dest.MacAddress, Mac.s)
  Protected Mac_String.MacAddress_String
  Mac_String\Mac = Mac
  
  *dest\Byte[0] = Val("$" + Mac_String\Stringfields\Byte1)
  *dest\Byte[1] = Val("$" + Mac_String\Stringfields\Byte2)
  *dest\Byte[2] = Val("$" + Mac_String\Stringfields\Byte3)
  *dest\Byte[3] = Val("$" + Mac_String\Stringfields\Byte4)
  *dest\Byte[4] = Val("$" + Mac_String\Stringfields\Byte5)
  *dest\Byte[5] = Val("$" + Mac_String\Stringfields\Byte6)
  
  ProcedureReturn #True
EndProcedure

; *Dest = Address with MagicPacket-Structure
; *Mac = Address with MacAddress-Structure and filled with createMacAddress()
Procedure createMagicPacket(*Dest.MagicPacket, *Mac.MacAddress)
  Protected i.b, j.b
  
  For i = 0 To 5              ; create Header of Packet ($FFFFFFFFFFFF)
    *Dest\Header[i] = $FF
  Next
  For i = 0 To 15             ; create 16 x MacAdress
    For j = 0 To 5
      *Dest\Mac[i]\Byte[j] = *Mac\Byte[j]
    Next j
  Next i
  
  ProcedureReturn #True  
EndProcedure

Procedure sendMagicPacket(*MagicPacket.MagicPacket, Host.s = "255.255.255.255", Port = 0)
  Protected cID
  Protected sendBytes.w
  Protected BufferLength = SizeOf(MagicPacket)

  cID = OpenNetworkConnection(Host, Port, #PB_Network_UDP)
  
  If cID
    sendBytes = SendNetworkData(cID, *MagicPacket, BufferLength)
    If sendBytes = -1
      Debug "sendMagicPacket: no Data transmitted"
      CloseNetworkConnection(cID)
      ProcedureReturn #False
    ElseIf sendBytes = BufferLength
      CloseNetworkConnection(cID)
      ProcedureReturn sendBytes
    Else
      Debug "sendMagicPacket: tData/Bufferlength: " +
            Str(sendBytes) + "/" + Str(BufferLength)
    EndIf
  Else
    Debug "sendMagicPacket: open Network Conection ERROR"
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #False
EndProcedure

; MAIN
; -------------------------------------

Define MagicPacket.MagicPacket, Mac.MacAddress

If InitNetwork()

  createMacAdress(@Mac, "11-22-33-44-55-66")
  createMagicPacket(@MagicPacket, @Mac)

  sendMagicPacket(@MagicPacket, "192.255.255.255")
  
EndIf
; --------------------------------------
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von NicTheQuick »

Hast du in Linux Wake on LAN aktiviert? Meistens muss man das erst mal manuell aktivieren.
Und ich bin mir nicht ganz sicher, aber ich kenne es von anderen Broadcasting-Sachen, dass man Broadcasting nur also root machen kann.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

Ob ich einen Pc aufwecken kann ist erstmal egal ... unter Linux sendet er kein einziges Byte (liefert nur -1 zurück) ... Mit root habe ich noch nicht ausführlich getestet, vielleicht liegt es daran. Werde das morgen mal testen ... danke für den Tipp
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

Egal was ich mache, es werden keine Bytes gesendet ... ob als root oder nicht, mit Debugger oder ohne ... auch andere Broadcast-Adressen funktionieren nicht 192.168.xxx.255 genauso wenig wie 10.255.255.255 ... bei allen anderen geht es (bei direkten Adressen wie z.B. 192.168.xxx.1)
Ports habe ich auch verschiedene versucht, 0, 7 und 9.
Ist das ein Bug oder liegt das an Linux ... gibt es eine Möglichkeit das zu umgehen? Vielleicht manuell ein Socket einrichten? Aber wie?
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von NicTheQuick »

Hast du es mal spaßeshalber mit netcat ausprobiert? Geht es damit? Das macht ja nicht viel anderes als dein Skript.
Siehe hier:quick wake on lan script with netcat
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

Habe es jetzt mit netcat und etherwake versucht, beides erfolglos ... werde jetzt versuchen ein C-Beispiel zu "übersetzen" und hoffe das ich es damit hinbekomme
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

Es scheint als funktioniert die PureBasic eigene Network-Lib nicht mit Broadcast unter Linux ... ich habe es jetzt so gelöst:

Code: Alles auswählen

Structure MacAddress
  Byte.b[6]
EndStructure

Structure MagicPacket
  Header.b[6]   ; Packet Header ($FFFFFFFFFFFF)
  Mac.MacAddress[16]  ; 16x Mac
EndStructure

Structure MacAdress_Stringfields
  Byte1.s{2}
  Seperator1.s{1}
  Byte2.s{2}
  Seperator2.s{1}
  Byte3.s{2}
  Seperator3.s{1}
  Byte4.s{2}
  Seperator4.s{1}
  Byte5.s{2}
  Seperator5.s{1}
  Byte6.s{2}
EndStructure

Structure MacAddress_String
  StructureUnion
    Stringfields.MacAdress_Stringfields
    Mac.s{17}
  EndStructureUnion
EndStructure

;Konstanten und Strukturen für Linux-sendMagicPacket()
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
        Structure sockaddr_in Align #PB_Structure_AlignC
          sin_family.u
          sin_port.u
          sin_addr.l
          sin_zero.a[8]
        EndStructure
      #AF_INET = 2      ;IPv4
      #SOCK_DGRAM = 2   ;UDP
      #SO_BROADCAST = 6 ;??
      #SOL_SOCKET = 1   ;??
      #IPPROTO_UDP = 0               ; andere als 0 = Socketfehler
      #FIONBIO = $5421
      #INVALID_SOCKET = -1
CompilerEndIf

Procedure createMacAdress(*Dest.MacAddress, Mac.s)
  Protected Mac_String.MacAddress_String
  Mac_String\Mac = Mac
  
  *dest\Byte[0] = Val("$" + Mac_String\Stringfields\Byte1)
  *dest\Byte[1] = Val("$" + Mac_String\Stringfields\Byte2)
  *dest\Byte[2] = Val("$" + Mac_String\Stringfields\Byte3)
  *dest\Byte[3] = Val("$" + Mac_String\Stringfields\Byte4)
  *dest\Byte[4] = Val("$" + Mac_String\Stringfields\Byte5)
  *dest\Byte[5] = Val("$" + Mac_String\Stringfields\Byte6)
  
  ProcedureReturn #True
EndProcedure
Procedure createMagicPacket(*Dest.MagicPacket, Mac.s)       ; use String and createMacAddress to create MacAddress
  Protected i.b, j.b
  Protected MacAddress.MacAddress
  
  createMacAdress(@MacAddress, Mac)
  
  For i = 0 To 5              ; create Header of Packet ($FFFFFFFFFFFF)
    *Dest\Header[i] = $FF
  Next
  For i = 0 To 15             ; create 16 x MacAdress
    For j = 0 To 5
      *Dest\Mac[i]\Byte[j] = MacAddress\Byte[j]
    Next j
  Next i
  
  ProcedureReturn #True  
EndProcedure

; Linux: Broadcast muss 255.255.255.255, die lokale Broadcast Addresse oder eine direkte IP sein
; Win: für Broadcast ist alles außer 255.255.255.255 zulässig
Procedure sendMagicPacket(Mac.s, Broadcast.s = "10.255.255.255", Port = 0)
  Protected cID
  Protected sendBytes.w
  Protected BufferLength = SizeOf(MagicPacket)
  Protected MagicPacket.MagicPacket
  
  createMagicPacket(@MagicPacket, Mac)
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      cID = OpenNetworkConnection(Broadcast, Port, #PB_Network_UDP)
      If cID
        sendBytes = SendNetworkData(cID, @MagicPacket, BufferLength)
        If sendBytes = -1
          Debug "AW-Lib sendMagicPacket: no Data transmitted"     ; ADD Use DebugLog & If CompilerDebug
          CloseNetworkConnection(cID)
          ProcedureReturn #False
        ElseIf sendBytes = BufferLength
          CloseNetworkConnection(cID)
          ProcedureReturn sendBytes
        Else
          Debug "AW-Lib sendMagicPacket: Buffer/Data length different ... tData/Bufferlength: " +
                Str(sendBytes) + "/" + Str(BufferLength)  ; ADD Use DebugLog & If CompilerDebug
        EndIf
      Else
        Debug "AW-Lib sendMagicPacket: open Network Conection ERROR"  ; ADD Use DebugLog & If CompilerDebug
        ProcedureReturn #False
      EndIf
      ProcedureReturn #True
      
    CompilerCase #PB_OS_Linux    
      Define TxAddr.sockaddr_in     
      Define Socket.i
      Define argp.l
      
      Protected InAddr_Broadcast  ; wir brauchen eine numerische IP
      InAddr_Broadcast = MakeIPAddress(Val(StringField(Broadcast, 1, ".")),Val(StringField(Broadcast, 2, ".")),
                                       Val(StringField(Broadcast, 3, ".")), Val(StringField(Broadcast, 4, ".")))

      ; Socket erstellen
      Socket = socket_(#AF_INET, #SOCK_DGRAM, #IPPROTO_UDP)
      If Socket = #INVALID_SOCKET
        Debug "SocketFehler"    ; ADD Use DebugLog & If CompilerDebug
      EndIf

      ; Blocking abschalten
      argp = 1
      ioctl_(Socket, #FIONBIO, @argp)
      
      ; Broadcasts erlauben
      argp = $FFFFFFFF ;INADDR_BROADCAST ; oder $FFFFFFFF
      setsockopt_(Socket, #SOL_SOCKET, #SO_BROADCAST, @argp, 4)
      
      ; Daten-Zeiger erzeugen
      TxAddr\sin_family = #AF_INET
      TxAddr\sin_port = htons_(Port)   ;PortNr.
      TxAddr\sin_addr = INADDR_BROADCAST
      
      ;senden
      sendto_(Socket, @MagicPacket, SizeOf(MagicPacket) , 0, @TxAddr, SizeOf(sockaddr_in))
      
      close_(Socket)
      ProcedureReturn #True
  CompilerEndSelect
  
  ProcedureReturn #False
EndProcedure

; -------------------- Main --------------------
InitNetwork()
sendMagicPacket("aa:bb:cc:dd:ee:ff", "192.168.0.255", 7)
; -------------------- Ende --------------------
klappt auch ohne root
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von NicTheQuick »

Aber warum geht es dann mit netcat und etherwake auch nicht?
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von Imhotheb »

da habe ich leider keine Antwort ... da ich sowieso keine externen Tools verwenden wollte, habe ich auch nicht weiter recherchiert. Aber seltsam ist es schon
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: WoL/MagicPacket Windows vs. Linux Problem

Beitrag von NicTheQuick »

Okay, schade. Bei Gelegenheit werde ich das jedenfalls auch mal ausprobieren.

Es wäre toll, wenn du jetzt noch EnableExplicit einbauen, das ganze vielleicht sogar als Modul umstellen, ein kleines Beispiel zwischen CompilerIf #PB_Compiler_IsMainFile und CompilerEndIf hinzufügen und das ganze dann zusammen mit einer kurzen Erklärung in Codes, Tipps und Tricks vorstellen könntest.
Antworten