Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Magic Packet richtig zusammenstellen (https://www.delphipraxis.net/134498-magic-packet-richtig-zusammenstellen.html)

stev-e87 23. Mai 2009 11:40


Magic Packet richtig zusammenstellen
 
Hallo,

ich versuche gerade meinen Rechner per WoL zu starten und benutze dazu den Code von Swissdelphicenter in leicht abgeänderter Art:

Delphi-Quellcode:
procedure Wake_On_LAN(Mac:String);
var
  Data, temp: string;
  k, n: integer;
begin
  Data := '';
  for k := 0 to 5 do
  begin
    Data := Data + Chr(StrToInt('$FF')); // 6x add a FF / 6x ein FF hinzufügen
  end;
  temp := StringReplace(Mac, '-', '', [rfReplaceAll]);
  for k := 0 to 15 do
  begin
    temp := StringReplace(Mac, '-', '', [rfReplaceAll]);
    for n := 0 to 5 do
    begin
      // 16x add Target-Mac-Adress / 16x die Ziel-Macadresse hinzufügen
      Data := Data + Chr(StrToInt('$' + temp[1] + temp[2]));
      Delete(temp, 1, 2);
    end;
  end;
  with Wnd_Main.IdUDPClient_WoL do begin
  //Example with TIdUDPClient of Indy
  Host:= '192.168.2.255';
  Port:= 2304;
  Send(Data); // Send it / Verschick es
  end;
end;
Änderungen:
- die Mac übergebe ich der Prozedur anstatt diese auszulesen (ist ja eh immer die gleiche ;)), auch in der Form 11-22-33-44-55-66
- Den Host tausche ich bei jedem Versuch von 255.255.255.255 auf 192.168.2.255

selbstverständlich ist Broadcast_Enable und Active bei der Indy Kompo True. Mit nem anderen funktionierenden Tool gehts, den rechner zu wecken.

Besonders lustig ist auch die Ausgabe von Wireshark:

Meine Variante bringt folgenden Quatsch (nur Datenteil):

0000 79 79 79 79 79 79 00 0d 61 45 1a 75 00 0d 61 45 yyyyyy..aE.u..aE
0010 1a 75 00 0d 61 45 1a 75 00 0d 61 45 1a 75 00 0d .u..aE.u..aE.u..
0020 61 45 1a 75 00 0d 61 45 1a 75 00 0d 61 45 1a 75 aE.u..aE.u..aE.u
0030 00 0d 61 45 1a 75 00 0d 61 45 1a 75 00 0d 61 45 ..aE.u..aE.u..aE
0040 1a 75 00 0d 61 45 1a 75 00 0d 61 45 1a 75 00 0d .u..aE.u..aE.u..
0050 61 45 1a 75 00 0d 61 45 1a 75 00 0d 61 45 1a 75 aE.u..aE.u..aE.u
0060 00 0d 61 45 1a 75 ..aE.u

wohingegen das andere Tool-wie es sein sollte, 6x FF am Anfang gefolgt von 16x Mac bringt, was Wireshark auch direkt als WoL identifiziert...

Bei anderen hat doch aber dieses Skript auch funktioniert... :wall:

Neutral General 23. Mai 2009 11:46

Re: Magic Packet richtig zusammenstellen
 
Hi,

Weiß nicht ob das dein Fehler ist. Wahrscheinlich nicht, aber das hier:

Delphi-Quellcode:
Data := Data + Chr(StrToInt('$FF'));
kann man auch einfach so schreiben:

Delphi-Quellcode:
Data := Data + Chr($FF);
Gruß
Neutral General

Apollonius 23. Mai 2009 11:50

Re: Magic Packet richtig zusammenstellen
 
Man könnte sogar gleich Data := #255#255#255#255#255#255 daraus machen.

Hast du mal im Debugger geschaut, was beim Versenden in Data steht?

stOrM 23. Mai 2009 12:04

Re: Magic Packet richtig zusammenstellen
 
So, oder bei den Schweizern nachsehen: Klick

Blödsinn sorry ! (Kommt davon wenn man nicht alles liest! ) :shock:

Hier gibt es noch etwas dazu Klick

stev-e87 23. Mai 2009 12:06

Re: Magic Packet richtig zusammenstellen
 
Hi,

also der Debugger liefert das für Data:

'ÿÿÿÿÿÿ'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#$D'aE'# $1A'û'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A
'û'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û '#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#
$D'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#$D 'aE'#$1A'û'#0#$D'aE'#$1A'û'#0#$D'aE'#$1A'û'

Auch nix anderes als die oben geposteten Bytes... :|

@Apollonius,Neutral General

Das vereinfacht zwar die Schreibweise, ändert aber leider am Resultat nix.

Hmmm-...

Phoenix 23. Mai 2009 12:51

Re: Magic Packet richtig zusammenstellen
 
Such mal hier in der DP nach Wake on Lan und Magic Packet. Da sollte es imho schon fertige Lösungen zu geben..

stev-e87 23. Mai 2009 13:21

Re: Magic Packet richtig zusammenstellen
 
Die fast immer auf die schweizer Lösung rauslaufen, die ich benutze...

stev-e87 23. Mai 2009 16:56

Re: Magic Packet richtig zusammenstellen
 
Mich wundert auch ganz stark, dass der Wireshark in der einfachsten Form, wenn data:=#255#255#255#255#255#255 oder eben 5x $FF ist ohne den ganzen Rest ranzuhängen 79 79 79 79 79 79 statt FF FF FF FF FF FF ergibt.Ist das jetzt vielleicht ein Problem der Indy (10.1) Komponenten? Da seh ich nicht mehr so ganz durch ...

Neutral General 23. Mai 2009 17:11

Re: Magic Packet richtig zusammenstellen
 
Hi,

Also meine Vermutung ist: Wenn die Send-Methode einen String erwartet, dann vielleicht einen darstellbaren?! Wobei... evtl ist $FF darstellbar. Aber vielleicht zählen auch nur 7-Bit ASCII Zeichen :mrgreen:

Was ich sagen will: Gibt es auch ne Send-Methode die nen Pointer oder sowas erwartet? Sodass du die Daten "roh" verschickst anstatt sie als String zu verschicken.

stev-e87 23. Mai 2009 17:28

Re: Magic Packet richtig zusammenstellen
 
Weiß ich jetzt nicht, könnte wohl noch sendbuffer verwenden aber da wollte er glaub ich auch ne Rückwandlung RawToString oder so.
die Mac-Adresse übergibt er ja bis auf die lezten beiden Bytes wiederum richtig... ein Kuddelmuddel ist das...

sx2008 23. Mai 2009 17:32

Re: Magic Packet richtig zusammenstellen
 
Wie ist denn die Send-Methode deklariert? Etwa so:
Delphi-Quellcode:
procedure Send(const buffer);
Dann muss man so senden:
Delphi-Quellcode:
Send(Data[1]); // man beachte das [1]

Neutral General 23. Mai 2009 17:36

Re: Magic Packet richtig zusammenstellen
 
Ich schätze es ist wirklich als Send(const S: String) deklariert. (const Buffer) wäre ohne Längenparameter etwas kritisch..

sx2008 23. Mai 2009 17:39

Re: Magic Packet richtig zusammenstellen
 
Zitat:

Zitat von Neutral General
Ich schätze es ist wirklich als Send(const S: String) deklariert. (const Buffer) wäre ohne Längenparameter etwas kritisch..

Stimmt. :pale:

stev-e87 23. Mai 2009 17:56

Re: Magic Packet richtig zusammenstellen
 
So, hab vor lauter Unverständnis noch mal die Delphi 6 IDE zum Laufen gebracht und was soll ich sagen, damit funktioniert es!
Kanns quasi nur noch an der Indy Komonente liegen oder arbeitet Delphi 2009 in Hinsicht auf das Problem anders? Denke doch nicht.

PS.: Die Deklaration ist Const AData:String

mkinzler 23. Mai 2009 17:59

Re: Magic Packet richtig zusammenstellen
 
String D6 = AnsiString
String D2009 = UnicodeString

Char D6 = AnsiChar ( 8Bit)
Char D2009 = WideChar ( 16Bit)

stev-e87 23. Mai 2009 19:06

Re: Magic Packet richtig zusammenstellen
 
Hab data im Deklarationsteil mal als AnsiString vorgegeben, das Ergebnis bleibt...

Apollonius 23. Mai 2009 19:32

Re: Magic Packet richtig zusammenstellen
 
Das kann auch nichts ändern, wenn Indy mit Unicode arbeitet. Man sollte eben binäre Daten nicht als String senden.

paritycheck 23. Mai 2009 20:35

Re: Magic Packet richtig zusammenstellen
 
Hi,
hab zwar kein Delphi 2009 zum testen aber vielleicht funktioniert folgender Code:

Delphi-Quellcode:
uses winsock;
....
function WakeOnLan(szMac: String): Boolean;
var
  sock         : TSocket;
  addr         : TSockAddrIn;
  WSA          : TWSAData;
  buf          : array[0..101] of byte;
  HWAddr       : array[0..5] of byte;
  bTrue        : Boolean;
  P            : PChar;
  I            : Integer;
  Code         : Integer;
  szTmp        : String;
  dwRet        : Cardinal;
  Seperatorcount: Integer;
begin
  bTrue:= True;
  Result:= False;

  Seperatorcount:= 0;
  if (length(szMac) <> 17) and (length(szMac) <> 12) then Exit;
  for I:= 1 to length(szMac) do begin
      if not (szMac[I] in ['A'..'F','0'..'9','a'..'f', '-', ':']) then Exit;
      if (szMac[i] in ['-', ':']) then begin
         inc(Seperatorcount);
         if Seperatorcount > 5 then Exit;
      end;
  end;

  szTmp:= szMac;
  repeat
    I:= pos('-', szTmp);
    if I > 0 then Delete(szTmp, I, 1);
  until
    I <= 0;
  repeat
    I:= pos(':', szTmp);
    if I > 0 then Delete(szTmp, I, 1);
  until
    I <= 0;

  FillChar(buf, 6, $FF);
  P:= PChar(szTmp);
  for I:= 0 to 5 do begin
      val('$'+P^+(P+1)^, HWAddr[i], Code);
      inc(P,2);
  end;
  for I:= 0 to 15 do
      move(HWAddr, buf[6+(i*6)], 6);

  dwRet:= WSAStartup((2 shl 8)+1, WSA);
  if dwRet = 0 then begin
     sock:= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if sock <> INVALID_SOCKET then begin
        if setsockopt(sock, SOL_SOCKET, SO_BROADCAST, pchar(@bTrue), sizeof(bTrue)) = 0 then begin
           FillChar(addr, sizeof(addr), 0);
           addr.sin_family:= AF_INET;
           addr.sin_addr.s_addr:= INADDR_BROADCAST;
           addr.sin_port:= htons(60000);
           dwRet:= sendto(sock, buf, sizeof(buf), 0, addr, sizeof(addr));
           Result:= (dwRet=sizeof(buf));
        end;
     end;
     WSACleanup;
  end;
end;

himitsu 23. Mai 2009 21:25

Re: Magic Packet richtig zusammenstellen
 
[durchstreich]
Delphi-Quellcode:
Data := #$00FF#$00FF#$00FF#$00FF#$00FF#$00FF
[/durchstreich]
edit: Blödsinn

Problem: siehe http://www.delphipraxis.net/internal...t.php?t=153308


Delphi-Quellcode:
var a: AnsiString;
  s: String;
begin
s := #$FF#$FF#$FF#$FF#$FF#$FF;
a := s;
if ord(s[1]) = ord(a[1]) then ;
Beides 255


welchen Zeichensatz/Kodierung verwendeten denn Indy?

stev-e87 24. Mai 2009 07:01

Re: Magic Packet richtig zusammenstellen
 
Zitat:

Zitat von paritycheck
Hi,
hab zwar kein Delphi 2009 zum testen aber vielleicht funktioniert folgender Code:

Delphi-Quellcode:
uses winsock;
....
function WakeOnLan(szMac: String): Boolean;
var
  sock         : TSocket;
  addr         : TSockAddrIn;
  WSA          : TWSAData;
  buf          : array[0..101] of byte;
  HWAddr       : array[0..5] of byte;
  bTrue        : Boolean;
  P            : PChar;
  I            : Integer;
  Code         : Integer;
  szTmp        : String;
  dwRet        : Cardinal;
  Seperatorcount: Integer;
begin
  bTrue:= True;
  Result:= False;

  Seperatorcount:= 0;
  if (length(szMac) <> 17) and (length(szMac) <> 12) then Exit;
  for I:= 1 to length(szMac) do begin
      if not (szMac[I] in ['A'..'F','0'..'9','a'..'f', '-', ':']) then Exit;
      if (szMac[i] in ['-', ':']) then begin
         inc(Seperatorcount);
         if Seperatorcount > 5 then Exit;
      end;
  end;

  szTmp:= szMac;
  repeat
    I:= pos('-', szTmp);
    if I > 0 then Delete(szTmp, I, 1);
  until
    I <= 0;
  repeat
    I:= pos(':', szTmp);
    if I > 0 then Delete(szTmp, I, 1);
  until
    I <= 0;

  FillChar(buf, 6, $FF);
  P:= PChar(szTmp);
  for I:= 0 to 5 do begin
      val('$'+P^+(P+1)^, HWAddr[i], Code);
      inc(P,2);
  end;
  for I:= 0 to 15 do
      move(HWAddr, buf[6+(i*6)], 6);

  dwRet:= WSAStartup((2 shl 8)+1, WSA);
  if dwRet = 0 then begin
     sock:= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if sock <> INVALID_SOCKET then begin
        if setsockopt(sock, SOL_SOCKET, SO_BROADCAST, p[color=#ff0000]ansi[/color]char(@bTrue), sizeof(bTrue)) = 0 then begin
           FillChar(addr, sizeof(addr), 0);
           addr.sin_family:= AF_INET;
           addr.sin_addr.s_addr:= INADDR_BROADCAST;
           addr.sin_port:= htons(60000);
           dwRet:= sendto(sock, buf, sizeof(buf), 0, addr, sizeof(addr));
           Result:= (dwRet=sizeof(buf));
        end;
     end;
     WSACleanup;
  end;
end;

Guten morgen...

Danke vielmals für die Bemühungen, mit obiger rot markierter Änderung hat es funktioniert ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz