Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wake on LAN (https://www.delphipraxis.net/8485-wake-lan.html)

Evian 5. Sep 2003 14:27


Wake on LAN
 
Hallo,
auf der Seite swissdelphicenter.ch habe ich ein Tutorial für das senden eines "Magic Packets"(für Wake on LAN) gefunden, aber wenn ich es so benutze, wie es da steht, kommt immer eine Access Denied Exception des idUDPClient1.

Da ich mich mit den Indy Komponenten und Netzwerktechnik nicht ganz so gut auskenne, wollt ich mal hier fragen, ob jemand weiß, woran das liegen könnte.


In dieser Zeile
Code:
 idUDPClient1.Send('255.255.255.255',80, Data);
schicke ich doch das Magic Packet an die IP 255.255.255.255. Ist das korreckt so?! Da der Rechner an den ich das Packet schicken will ja offline ist muss ich doch das Packet an alle IP adressen im LAN schicken, wie mache ich das mit dem idUDPClient1?

Über Hilfe würde ich mich sehr freuen.

MFG

Evian

Generalissimo 5. Sep 2003 15:12

Re: Wake on LAN
 
Das soll doch nur ein Bsp. darstellen mit der IP oder ist das wirklich
deine IP?

Sieht eher wie ne SubNet-Mask aus

Generalissimo 5. Sep 2003 15:17

Re: Wake on LAN
 
Vielleicht hilft das:

Demos zu Indy:

http://www.indyproject.org/indy/demo...os_24Nov02.zip

Und die Hilfe:

Hilfe im PDF-Format

Phoenix 5. Sep 2003 16:20

Re: Wake on LAN
 
Zitat:

Zitat von Evian
Da der Rechner an den ich das Packet schicken will ja offline ist muss ich doch das Packet an alle IP adressen im LAN schicken, wie mache ich das mit dem idUDPClient1?

Dem ist so nicht korrekt.
Der Rechner ist aus, es läuft also keine Software darauf, also auch kein TCP/IP - Stack, der Rechner hat also KEINE IP-Adresse. Demnach kann er auch nicht auf einen IP-Broadcast reagieren.

Du musst das MagicPaket direkt an die MAC-Adresse des Zielrechners schicken (auch hier: KEIN Broadcast, das klappt nicht). Nur wenn die Netzwerkkarte selber merkt: "Huch! Da ist ja ein Paket für mich!" liest es dieses aus, findet dort den Befehl zum starten des Rechners und löst ein Wake on Lan-Event aus.

Also: Wake-on-Lan - Pakete immer nur an die MAC-Adresse, und da hilft dir UDP auch nicht, weils ja auch wieder auf IP basiert. Du musst dafür schon ein Netzwerklayer weiter nach unten :)

Chewie 5. Sep 2003 17:22

Re: Wake on LAN
 
Zitat:

Zitat von Phoenix
Also: Wake-on-Lan - Pakete immer nur an die MAC-Adresse, und da hilft dir UDP auch nicht, weils ja auch wieder auf IP basiert. Du musst dafür schon ein Netzwerklayer weiter nach unten :)


Oder auch zwei oder drei :wink:

Sharky 6. Sep 2003 07:44

Re: Wake on LAN
 
Zitat:

Zitat von Phoenix
...Dem ist so nicht korrekt.
Der Rechner ist aus, es läuft also keine Software darauf, also auch kein TCP/IP - Stack, der Rechner hat also KEINE IP-Adresse. Demnach kann er auch nicht auf einen IP-Broadcast reagieren.
....
Du musst das MagicPaket direkt an die MAC-Adresse des Zielrechners schicken...

Auch das ist nicht korrekt.

Wenn ich mich recht entsinne wird das Magic-Packet wirklich als UDP-Broadcast an 255.255.255.255 gesendet. Da in diesem Packet ja die MAC des Rechners steht kann die NIC dies auswerten.

[edit=Daniel B]Quote-Tags korrigiert. Mfg, Daniel B[/edit]

Evian 6. Sep 2003 19:29

Re: Wake on LAN
 
Zitat:

Zitat von Sharky

Wenn ich mich recht entsinne wird das Magic-Packet wirklich als UDP-Broadcast an 255.255.255.255 gesendet. Da in diesem Packet ja die MAC des Rechners steht kann die NIC dies auswerten.

Und arum kommt dann eine 'Access Denied' Exception? Wenn ich eine andere IP nehme gibt es den fehler nicht.

[edit=Luckie]Quote-Tags gefixt. Mfg, Luckie[/edit]

Evian 8. Sep 2003 09:29

Re: Wake on LAN
 
Ok hab mit dem Autor von dem Tip im Swiss Delpihcenter geredet und das Problem liegt daran, dass man beim Socket Broadcast auf true setzen kann.. weil ja sonst klar ist, dass es einfach nicht funktionieren kann.
Wenn man es aber macht, dann funzt der Code Prima!

MFG

Evian

Ricane 19. Aug 2004 07:58

Re: Wake on LAN
 
Sagt mal...

wie "mächtig" ist dieses Wake on Lan denn?! Der Rechner wird ja per MAC Adresse hochgefahren, die ja jeweils einzigartig ist (wobei es Programme gibt, die die ändern können...).

Wenn ich die MAC Adresse eines Freundes aus Singapore kenne, kann ich dann von hier seinen Rechner booten?


Beste Grüsse,

Ricane


EDIT: Hab mir gerade das 7 - Schichten Modell nochmal angeguckt und selbst gemerkt das es nur im lokalen Netzwerk geht... sonst würde es ja Wake on WAN heissen :roll:

MaBuSE 19. Aug 2004 10:16

Re: Wake on LAN
 
Zitat:

Zitat von Ricane
wie "mächtig" ist dieses Wake on Lan denn?! Der Rechner wird ja per MAC Adresse hochgefahren, die ja jeweils einzigartig ist (wobei es Programme gibt, die die ändern können...). Wenn ich die MAC Adresse eines Freundes aus Singapore kenne, kann ich dann von hier seinen Rechner booten?

EDIT: Hab mir gerade das 7 - Schichten Modell nochmal angeguckt und selbst gemerkt das es nur im lokalen Netzwerk geht... sonst würde es ja Wake on WAN heissen :roll:

Es gibt wohl Tools die das können sollen. :mrgreen:
(z.B. hier: http://www.depicus.com/wake-on-lan/woli.asp )

Hier habe ich noch mal einen Link, der WOL / Delphi beschreibt.
Dort ist auch ein Netzwerk Dump zusehen, in dem erklärt ist wie das ganze auf Byte-Ebene aussieht.

http://www.sysworksoft.net/support/delphiwol.html

hth

[OT]@Ricane: Ist Dein Avatar ein Bild von Dir? :mrgreen:[/OT]

phXql 19. Aug 2004 10:24

Re: Wake on LAN
 
Zitat:

Zitat von Evian
Ok hab mit dem Autor von dem Tip im Swiss Delpihcenter geredet und das Problem liegt daran, dass man beim Socket Broadcast auf true setzen kann.. weil ja sonst klar ist, dass es einfach nicht funktionieren kann.
Wenn man es aber macht, dann funzt der Code Prima!

MFG

Evian

hättest du die kommentare zu diesem tipp gelesen, hättest du einen link in das forum bekommen, wo genau das mit dem broadcast steht ;)

Ricane 25. Aug 2004 13:27

Re: Wake on LAN
 
Zitat:

Zitat von MaBuSE
[...]
[OT]@Ricane: Ist Dein Avatar ein Bild von Dir? :mrgreen:[/OT]

Ne, ist meine Freundin... bin ja auch ein männlicher-welcher... :mrgreen:

MaBuSE 25. Aug 2004 13:36

Re: Wake on LAN
 
Zitat:

Zitat von Ricane
Zitat:

Zitat von MaBuSE
[...]
[OT]@Ricane: Ist Dein Avatar ein Bild von Dir? :mrgreen:[/OT]

Ne, ist meine Freundin... bin ja auch ein männlicher-welcher... :mrgreen:

Antwort da OT hier: http://www.delphipraxis.net/internal...ct.php?t=32891

Gambit 16. Nov 2005 09:04

Re: Wake on LAN
 
Hallo,

für mich ist der Code der Schweizer so irgendwie gar nicht nachvollziehbar:

Delphi-Quellcode:
{
What's a Magic Packet?
Was ist ein Magic Packet?

DESTINATION SOURCE MISC. FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC. CRC.

Note: Destination, Source, Misc and CRC are normally added by our Socket-Component
Beachte: Destination, Source, Mis und CRC werden normalerweise von deiner
Socket-Komponente hinzugefügt
}

procedure TForm1.Button1Click(Sender: TObject);
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(Edit1.Text, '-', '', [rfReplaceAll]);
  for k := 0 to 15 do
  begin
    temp := StringReplace(Edit1.Text, '-', '', [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;
 
  //Example with TIdUDPClient of Indy
  //IdUDPClient1.Send('255.255.255.255', '80', Data); // Send it / Verschick es
end;
Zum einen wird der Variablen Temp zweimal das Selbe zugeordnet, was entweder einmal zuviel ist oder es soll anders heißen und zum zweiten können die Übergabeparameter für IdUDPClient1.Send so gar nicht stimmen, weil dort nur ein Parameter erwartet wird.

So funzt es zumindest mit dem Beispiel(hier ausgeklammert) nicht...

Gruß

Gambit

ManuMF 16. Nov 2005 15:24

Re: Wake on LAN
 
Es gibt für Send mehrere Prozeduren.
Ich verwende übrigens folgenden Code:
Delphi-Quellcode:
var data, temp, mac: String;
    k: Integer;

begin
  mac := StringReplace(MacEdit.Text, '-', '', [rfReplaceAll]);

  temp := '';
  for k := 0 to 5 do
    temp := temp + Chr(StrToInt('$' + Copy(mac, k * 2 + 1, 2)));
  for k := 0 to 3 do
    temp := temp + temp;
  Data := #255#255#255#255#255#255 + temp;

  UDPClient.Send('255.255.255.255', 80, Data);
end;
Gruß,
ManuMF

Gambit 16. Nov 2005 15:53

Re: Wake on LAN
 
Zitat:

Zitat von ManuMF
Es gibt für Send mehrere Prozeduren.

Gruß,
ManuMF

Ja schon, aber ich bekam mit dem Code die Meldung, dass es keine überladenen Methoden von Send mit den Parametern gibt. Vielleicht wars ja ein Paste und Copy Fehler. Ich habe Port und Broadcast IP im Oberinspector übernommen und als Parameter weggelassen, das ging dann auch...

Puhbaehr 18. Nov 2005 08:48

Re: Wake on LAN
 
Grobes Beispiel;

Delphi-Quellcode:
var
  UDPClient : TIdUDPClient;
  ...

  //UDPClient := TIdUDPClient.Create (nil);
   
  UDPClient.BroadcastEnabled := true;
  UDPClient.Host := '255.255.255.255';
  UDPClient.Port := 2050;

  UDPClient.SendBuffer (Data, SizeOf (Data));
So nimmt es zumindest der Compiler an und es gibt keine Exceptions. Ob es wirklich funktioniert werde ich in ein paar Minuten sehen wenn ich meinen Rechner magisch erwachen lasse :) (Braucht aber noch etwas da der Nachbar scheinbar noch schläft lol)

Data ist genau das was die Definition des SwissDelphiCenter besagt.

Puhbaehr 20. Nov 2005 04:51

Re: Wake on LAN
 
So, obiges Beispiel was ich gepostet hab funktioniert so nicht wirkich.

Der Teil mit dem Absenden funktioniert prächtig, sofern der Aufbau/Inhalt von Data richtig ist. Denn die Umsetzung der Definition der Schweizer haut irgendwie nicht hin:
Delphi-Quellcode:

What's a Magic Packet? 
Was ist ein Magic Packet? 

DESTINATION SOURCE MISC. FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC. CRC.

Note: Destination, Source, Misc and CRC are normally added by our Socket-Component
Beachte: Destination, Source, Mis und CRC werden normalerweise von deiner Socket-Komponente hinzugefügt
}
Laut der Definition werden...
1. Destination, Source, Misc (?) und CRC (?) von der Komponte eingefügt. D.h. in dem Fall Indy. Ob das so ist...weiß ich nicht.
2. 6 mal die Hex-Zahl 0xFF (Dez 255)
3. 16 mal die Mac-Adresse im HexFormat

Ob die Punkte eine Bedeutung haben? Ich denke mal nicht.
Aber somit sollte es gehen? Tut es aber nicht, zumindest nicht bei mir.
Schicken wir Data so ab kommen wir auf eine Gesamtlänge von 102.

Sehen wir uns das Beispiel von Sysworksoft.net an, fällt sofort auf, dass Data hier eine größe von 116 Byte hat. Also fehlt bei den Schweizern irgendwas.
Aber was?
Es werden zusätzlich vor 6 mal 0xFF, also vor 2. 0x00 und 0x74 (Dez 116) eingefügt und nachträglich 0x00, 0x40, 0x90, 0x90, 0x00 und 0x40.

Speicherauszug von Data wäre somit:
Delphi-Quellcode:
{
11 22 33 44 55 66 00 74 FF FF FF FF FF FF 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 
55 66 40 00 90 90 40 00 
}
Die ersten 6 Bytes, die Ziel-MAC. Ist denk ich klar. Obwohl sie glaub ich optional sein kann. Anschließend Byte 00 und 74, scheint die Gesamtlänge des "Pakets" zu sein (16 Bit), also die 116. FF FF FF FF FF FF ist, so wie ich es weiß, der Code (Befehl) an die Netzwerkkarte den Rechner anzuschalten.
Aber was ist der Rest?
Misc scheint ja nun die Länge zu sein. Aber Misc am Ende? O.o
Ok, mit Hilfe von Wiki lässt sich nun auch [wiki]CRC[/wiki] erklären und CRC ist demnach die 16-Bit große optionale Prüfsumme über den UDP-Kopf (bestehend aus dem Pseudo-Header der wiederrum aus Quell-IP, Ziel-IP, leer 8-Bitfeld, Protokoll-Typ (8 Bit, UDP = 17)) und die Länge des Pakets und zusätzlich aus den eigentlichen Daten besteht die aber im UDP-Header angesiedelt wird?
Mh...ist mir noch nicht ganz einleuchtend wieso die nun am Ende steht obwohl sie im Kopf stehen müsste? (wenn es eine gibt...)
Aber erstmal egal. Damit funktioniert es zumindest ersteinmal.

Ich hätte nun noch eine andere Frage zum WakeOnLan.

Das "MagicPaket" wird ja übers User Data Protocoll geschickt welches Verbindungslos ist. D.h. der Empfänger sendet keine Empfangsbesätigung an den Sender zurück sobald das Paket wirklich angekommen sind (wie es bei TCP als verbindungsorientiertes Protokoll ist).
Somit weiß ich nicht ob das MagicPaket wirkich angekommen ist.
Aber hab ich dennoch eine Möglichkeit schnell zu erfahren ob das Paket angekommen ist? Kann ich denn TCP fürs MagicPaket verwenden?
Denn irgendwie, als ich WakeOnLan das erste mal testete wollte es manchmal gar nicht anspringen, obwohl ich mehrere Programme (auch fertige) verwendete. Erst als ich den Rechner öfter mit WakeOnLan hochfahren ließ versagte er seltener. Es ist also sehr unzuverlässig. Ich brauche aber dennoch eine sichere Möglichkeit den Rechner übers Netzwerk einzuschalten.

Vielen Dank!

Gruß, Robert

Daniel B 20. Nov 2005 09:08

Re: Wake on LAN
 
http://www.delphipraxis.net/internal...highlight=wake

ManuMF 20. Nov 2005 10:02

Re: Wake on LAN
 
Hallo,

das Problem ist folgendes:
Die Schweizer verwenden für den Port einen String, aber ab Indy 10 ist es ein Integer!

Gruß,
ManuMF

Puhbaehr 20. Nov 2005 22:17

Re: Wake on LAN
 
Zitat:

Zitat von Daniel B
http://www.delphipraxis.net/internal_redirect.php?t=17592&highlight=wake

Wolltest du mir jetzt zeigen, dass die DP bereits auch diesen Codeschnippsel enthält? *g* ;)

Zitat:

Zitat von ManuMF
...Die Schweizer verwenden für den Port einen String, aber ab Indy 10 ist es ein Integer!

Öhm...ich hätte fast das Wort "Port" überlesen, ich dachte erst du meinst "Data", also die MagicPaket-Daten.

Nunja, aber ich verwende noch Indy 9 und dabei wird der Port bereits als Integer verlangt. Hätte ich ihn als String übergeben würde der Compiler gar nicht erst anfangen zu compilieren :)

Aber die Möglichkeit, dass die Fehler durch die Verwendung von verschiedenen Indy-Versionen zustande kommt, dass die Schweizer eine andere Version verwenden als ich wäre immerhin höchst wahrscheinlich. Immerhin ist der erste Teil des Threads bereits etwas älter. Danke für den Hinweis!

Und zu der WakeOnLAN Bestätigung, ich glaube zwar nicht, dass hier ein TCP-Protokoll funktioniert, aber ich werde es dennoch demnächst testen. Vielleicht will es ja irgendwie. Oder mir kommt während dessen eine andere Idee.
Aber ich glaube nicht, dass es die Möglichkeit gibt. Die Netzwerkkarte schläft ja quasi noch. Obwohl, Daten empfangen kann sie ja, also sollte sie doch fähig sein welche zu versenden. Mhh... Probieren geht über Studieren :) Werd mir aber trotzdem mal (demnächst!) die MagicPaket-Funktion(en) genauer anschauen. Vielleicht hat ja AMD dazu schon etwas entwickelt. Oder die Hersteller einzelner Grafikkarten haben sich selbst an die Nase gegriffen und haben gesagt "Mensch, wenn jemand einen PC im Keller stehen hat und den durch das super coole (damals noch neue) WakeOnLAN hochfährt könnte man ihm das doch auch quittieren. Sonst würde er im Dunkeln tappen und erst nach ein paar Minuten erfahren ob das WakeOnLAN funktioniert hat!" :) Aber das erst demnächst, denn im Moment klappt es und das werd ich erstmal so hinnehmen. Denn es gibt derzeit viel wichtigeres zu tun! :coder:

Vielen Dank soweit an alle!

Gruß, Robert

Gambit 21. Nov 2005 00:07

Re: Wake on LAN
 
Ich habe das mit der Rückantwort so gelöst, dass mein Programm nach dem Senden des Magic Packets vom Desktop verschwindet, im Hintergrund aber noch eine Weile weiterläuft und nach 30 Sekunden in 15 Sekündigen Abständen einen Ping an den Remote Host absetzt. Bekomm ich ne Antwort vom Host, erscheint ne Meldung, dass der PC hochgefahren ist, wenn nach 2 Minuten nichts zurückkommt, kommt ne Fehlermeldung. Ist zwar nicht so komfortabel wie ne direkte Rückmeldung, ich weiß aber immerhin nach spätestens 2 Minuten, woran ich bin. Die Zeiten kann man ja auch noch anpassen...

Gruß

Gambit

Puhbaehr 21. Nov 2005 00:49

Re: Wake on LAN
 
So hab ich das bisher auch umgesetzt und setze das schon eine Weile ein (allerdings vorher mit einem externen Tool das ich nur mit ShellExecute aufgerufen hab).
Es ist erstmal eine Lösung, ja. Aber wie du schon sagst keinesfalls komfortabel. Wenn der Rechner, so wie meiner, bis zu 5 Minuten brauch bis er hochgefahren ist, ist es regelrecht belastend zu wissen der Rechner ist nach 5 Minuten noch nicht oben und ich muss noch ein MagicPaket abschicken um wieder nach 5 Minuten evtl. zu erfahren er hat es wieder nicht geschaft. Denn sonst, wenn ich sofort wüsste ob der Rechner auf das MagicPaket nicht reagiert hat könnte ich ein paar weitere schicken um es nochmal zu versuchen.

Aber es muss erstmal so gehen.

Weiß denn jemand welche Gründe es haben könnte, dass der Rechner mal reagiert und mal nicht?
Den einen Tag saß ich echt davor... hatte das Programmicon in dem Ordner das einfach nur das MagicPaket absendete (ohne irgendwelche Meldungen/Überprüfungen). Ich wusste es funktioniert auf jeden Fall. Ich hab es zig mal gestartet und kurioser Weise jedesmal der Rechner jedesmal wenn ich das Programm (!) per Doppelklick mit der Maus öffete. Der Rechner blieb aber jedesmal aus wenn ich das Programm durch (vorher Markieren und) Enter drücken startete! Zufall? :gruebel: :cyclops: :shock:

Gruß, Robert

seim 1. Okt 2008 11:09

Re: Wake on LAN
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab das nochmal durchgeguckt und bin zu folgendem funktionierenden Code gekommen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    IdUDPClient1: TIdUDPClient;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{
What's a Magic Packet?
Was ist ein Magic Packet?

DESTINATION SOURCE MISC. FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC. CRC.

Note: Destination, Source, Misc and CRC are normally added by our Socket-Component
Beachte: Destination, Source, Mis und CRC werden normalerweise von deiner
Socket-Komponente hinzugefügt
}

procedure TForm1.Button1Click(Sender: TObject);
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(Edit1.Text, '-', '', [rfReplaceAll]);
  for k := 0 to 15 do
  begin
    temp := StringReplace(Edit1.Text, '-', '', [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;
 
  //Example with TIdUDPClient of Indy
  IdUDPClient1.Host:= '255.255.255.255';
  IdUDPClient1.Port:= 80;
  IdUDPClient1.Send(Data); // Send it / Verschick es
end;

end.
Hier die .dfm (also alles was quasi in der Fensteransicht eingestellt wurde)
Delphi-Quellcode:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 294
  ClientWidth = 562
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 216
    Top = 120
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 168
    Top = 80
    Width = 249
    Height = 21
    TabOrder = 1
    Text = 'aa-bb-cc-dd-ee-ff'
  end
  object IdUDPClient1: TIdUDPClient
    BroadcastEnabled = True
    Port = 80
    Left = 424
    Top = 216
  end
end
Damit Wake On Lan funktioniert muss die Funktion natürlich im Bios des betreffenden Rechners aktiviert sein. Außerdem endet ein solcher Boardcast beim Router, wenn ihr also in ein anderes Subnetz wollt um ein Rechner zu booten, dann weis ich jetzt spontan auch nicht weiter.. Jedenfalls geht das Programm bei mir.

Codewalker 1. Okt 2008 12:06

Re: Wake on LAN
 
Zitat:

Zitat von seim
Damit Wake On Lan funktioniert muss die Funktion natürlich im Bios des betreffenden Rechners aktiviert sein. Außerdem endet ein solcher Boardcast beim Router, wenn ihr also in ein anderes Subnetz wollt um ein Rechner zu booten, dann weis ich jetzt spontan auch nicht weiter.. Jedenfalls geht das Programm bei mir.

Außerdem muss der Rechner ordnungsgemäßg runtergefahren werden und danach dauerhaft am Strom hängen. Einmal Stecker raus und wieder rein --> kein Wake-on-LAN mehr.

Zum Routerproblem: Ein Broadcast endet an der nächsten Kollisionsdomäne - in diesem Falle der Router. Broadcasts werden nicht geroutet, sonst wäre im Netz unwesentlich mehr los. Es gibt aber einen Trick: Das ganze als Paket an den Router senden mit einem benannten Port (z.B. 1234). Im Router dann ein Port-Forwarding einrichten, und eingehende Pakete auf Port 1324 forwarden auf die lokale Broadcast-Adresse.
Das klappt soweit ganz gut, nur so populäre Boxen wie die FritzBox unterbinden das, weil die FritzBox meint, du wüsstest nicht was du tust :mrgreen:
Mit ein wenig basteln, ist das aber bei (fast) jedem Router hinzukriegen

seim 21. Okt 2008 19:39

Re: Wake on LAN
 
Zitat:

Zitat von Codewalker
endet an der nächsten Kollisionsdomäne - in diesem Falle der Router

Eine Kollisionsdomäne ist das Netzwerk mit einem Hub..

Osmodia666 21. Apr 2011 00:01

AW: Wake on LAN
 
Ich weiß der Thread ist schon etwas älter, allerdings bekomme ich beim senden des Magic Packets den Fehler "Socket Error # 11001 Host not found"
Das ist merkwürdig, denn mit derselben MAC Adresse kann ich jederzeit problemlos mit einem anderen Programm den Rechner aus dem Schlaf erwecken.
Der Code ist bis auf:

Delphi-Quellcode:
IdUDPClient1.Host:= Edit1.Text; bzw. IdUDPClient1.Host:= '192.168.0.255';
  IdUDPClient1.Port:= 80;
  IdUDPClient1.Send(Data); // Send it / Verschick es
end;
identisch.

Mit dem Text aus dem Edit gibts den oben genannten fehler, mit der IP Range passiert gar nichts. Keine Fehlermeldung, nichts.
Hab ich irgendwo einen Denkfehler drin, oder ist es einfach nur zu spät :)

Broadcast und Active vom UDPIndyClient sind aktiv.

hathor 21. Apr 2011 07:30

AW: Wake on LAN
 
Was enthält "Data"?

Magic Packet

Die Netzwerkkarte wartet auf ein so genanntes Magic Packet (Schutzmarke von AMD), bei dessen Empfang der Rechner eingeschaltet wird.

Das Datenpaket ist entweder direkt an die Netzwerkkarte adressiert oder wird als Broadcast verschickt. Es enthält sechsmal in Folge den hexadezimalen Wert FF; unmittelbar danach erscheint die ununterbrochene 16-malige Wiederholung der MAC-Adresse der Netzwerkkarte. Dieser Inhalt kann in ein beliebiges Paket (z. B. IP, IPX) verpackt sein. Es existieren viele Software-Tools (z. B. etherwake für unixähnliche Betriebssysteme), um solche Pakete zu versenden.

Osmodia666 21. Apr 2011 08:23

AW: Wake on LAN
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    IdUDPClient1: TIdUDPClient;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{
What's a Magic Packet?
Was ist ein Magic Packet?

DESTINATION SOURCE MISC. FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44
55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC. CRC.

Note: Destination, Source, Misc and CRC are normally added by our Socket-Component
Beachte: Destination, Source, Mis und CRC werden normalerweise von deiner
Socket-Komponente hinzugefügt
}

procedure TForm1.Button1Click(Sender: TObject);
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(Edit1.Text, '-', '', [rfReplaceAll]);
  for k := 0 to 15 do
  begin
    temp := StringReplace(Edit1.Text, '-', '', [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;
 
  //Example with TIdUDPClient of Indy
  IdUDPClient1.Host:= '255.255.255.255';
  IdUDPClient1.Port:= 80;
  IdUDPClient1.Send(Data); // Send it / Verschick es
end;

end.
Ich habe den Code unverändert übernommen, Data enthält also 6 x FF und die Broadcastadresse aus dem Edit.

pustekuchen 21. Apr 2011 08:46

AW: Wake on LAN
 
Zitat:

Zitat von Osmodia666 (Beitrag 1096323)
Ich habe den Code unverändert übernommen, Data enthält also 6 x FF und die Broadcastadresse aus dem Edit.

Muss dort nicht die MAC-Adresse ins Edit?

divBy0 21. Apr 2011 08:58

AW: Wake on LAN
 
Ins Edit muss die MAC des Zielrechners, im ausgeschalteten Zustand hat der Zielrechner ja noch keine IP.

6x FF 16x MAC

Osmodia666 21. Apr 2011 09:13

AW: Wake on LAN
 
Sry, hab mich verschrieben. Ich meinte natürlich die MAC Adresse.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.

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