Entwickler-Ecke

Internet / Netzwerk - Wake on Lan


maxk - Fr 09.08.02 10:55
Titel: Wake on Lan
Hi,
ich suche eine Möglichkeit einen Rechner via LAN hochzufahren. Die Netzwerkkarte alsauch der Rechner unterstützen diese Funktion. Ich weiß, dass irgendeine Zeichenkette an die Netzwerkkarte gesendet werden muss, weiß aber nicht welche bzw. wie. Kann mir da jemand helfen?

maxk


Tino - Fr 09.08.02 11:08
Titel: Re: Wake on Lan
maxk hat folgendes geschrieben:
{...} irgendeine Zeichenkette an die Netzwerkkarte gesendet werden muss, weiß aber nicht welche {...}
Schau doch mal in das Handbuch der Netzwerkkarte. Wenn die Karte so eine Funktion bietet sollte diese auch beschrieben sein!

Gruß
TINO


maxk - Fr 09.08.02 12:11

Ich habe im Handbuch schon nachgeschaut, aber nur wenige Hersteller schreiben solche Daten in ihre Handbücher. Außerdem ist das größere Problem immernoch das Sender der Zeichenkette.


DeCodeGuru - Fr 09.08.02 13:54

ein blick auf die herstellerseite kann auch nicht schaden :wink:


DaFox - Fr 09.08.02 19:01

Hi,

der String, den du übergeben musst nennt sich "Magic Packet".
Dieser setzt sich zusammen aus 6x FF und 16x der MAC-Adresse.
So, das ist das was ich mir gemerkt habe. Wie du das an die Karte schickst weiß ich nicht, jedoch geht das nicht über TCP/IP, denn es muss direkt zum NDIS-Treiber.
Vielleicht geht's über "Winsock2 raw packet"?

Gruß


mcbrunox - Fr 07.02.03 14:10

wie versprochen der source:
mit getmacadress bekommst du dein MAC Adresse der Netzcard und dann wakeup2.Stell im Bios des hochzufahrenden Rechner alle eigenschaften von WakeUp auf true<<<falls dieses es unterstützt, sonst gehts auch nicht.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;

  URetCode: PChar;
  RetCode: char;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string; 
begin 
  Result    := ''; 
  _SystemID := ''; 
  Getmem(NCB, SizeOf(TNCB)); 
  Fillchar(NCB^, SizeOf(TNCB), 0); 

  Getmem(Lenum, SizeOf(TLanaEnum)); 
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0); 

  Getmem(Adapter, SizeOf(TAdapterStatus)); 
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);

  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM); 
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);

  i := 0; 
  repeat 
    Fillchar(NCB^, SizeOf(TNCB), 0); 
    Ncb.ncb_command  := chr(NCBRESET); 
    Ncb.ncb_lana_num := lenum.lana[I];
    RetCode          := Netbios(Ncb);

    Fillchar(NCB^, SizeOf(TNCB), 0); 
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[I]; 
    // Must be 16
    Ncb.ncb_callname := '*               '; 

    Ncb.ncb_buffer := Pointer(Adapter); 

    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]... 
    if (RetCode = chr(0)) or (RetCode = chr(6)) then 
    begin 
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[5]), 2); 
    end;
    Inc(i); 
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB); 
  FreeMem(Adapter); 
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;

procedure wakeup2(ss: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(ss, '-', '', [rfReplaceAll]);
  for k := 0 to 15 do
  begin
    temp := StringReplace(ss, '-', '', [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;
  hase.Host:='255.255.255.255';
  hase.port:=80;
  hase.Send(Data);  // Send it / Verschick es
end;


musst nur noch den TIdUDPClient auf die Form ziehen.
Oft ist es hilfreich seiten dieser Art zu besuchen http://www.swissdelphicenter.ch/de/tipsindex.php
auch hier wird man fündig
gruss
bruno