![]() |
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:
Änderungen:
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; - 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: |
Re: Magic Packet richtig zusammenstellen
Hi,
Weiß nicht ob das dein Fehler ist. Wahrscheinlich nicht, aber das hier:
Delphi-Quellcode:
kann man auch einfach so schreiben:
Data := Data + Chr(StrToInt('$FF'));
Delphi-Quellcode:
Gruß
Data := Data + Chr($FF);
Neutral General |
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? |
Re: Magic Packet richtig zusammenstellen
|
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-... |
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..
|
Re: Magic Packet richtig zusammenstellen
Die fast immer auf die schweizer Lösung rauslaufen, die ich benutze...
|
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 ...
|
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. |
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... |
Re: Magic Packet richtig zusammenstellen
Wie ist denn die Send-Methode deklariert? Etwa so:
Delphi-Quellcode:
Dann muss man so senden:
procedure Send(const buffer);
Delphi-Quellcode:
Send(Data[1]); // man beachte das [1]
|
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..
|
Re: Magic Packet richtig zusammenstellen
Zitat:
|
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 |
Re: Magic Packet richtig zusammenstellen
String D6 = AnsiString
String D2009 = UnicodeString Char D6 = AnsiChar ( 8Bit) Char D2009 = WideChar ( 16Bit) |
Re: Magic Packet richtig zusammenstellen
Hab data im Deklarationsteil mal als AnsiString vorgegeben, das Ergebnis bleibt...
|
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.
|
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; |
Re: Magic Packet richtig zusammenstellen
[durchstreich]
Delphi-Quellcode:
[/durchstreich]
Data := #$00FF#$00FF#$00FF#$00FF#$00FF#$00FF
edit: Blödsinn Problem: siehe ![]()
Delphi-Quellcode:
Beides 255
var a: AnsiString;
s: String; begin s := #$FF#$FF#$FF#$FF#$FF#$FF; a := s; if ord(s[1]) = ord(a[1]) then ; welchen Zeichensatz/Kodierung verwendeten denn Indy? |
Re: Magic Packet richtig zusammenstellen
Zitat:
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