Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
Seite 2 von 4     12 34      

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