Avatar billede kipolaks Nybegynder
24. april 2003 - 20:39 Der er 9 kommentarer og
1 løsning

WakeOnLan ??

Hvaaaa??? Hva'så?? nå ok...

OK, Here goes... jeg har et lille problem som jeg lige håbede i kunne hjælpe mig med (som altid)... :)

WOL... ringer der klokker?? det tænkte jeg nok :) WakeOnLan! hvordan er det lige jeg sender sådan en såkaldt "Magic Packet" med winsock for at kunne bruge min WOL funktion?? (jeg kender MAC adressen)

det burde vel ikke være noget problem lige a stykke et par linjer kode sammen vel ? :)

JEG TAKKER PÅ FORHÅND!!!
Avatar billede teknik Juniormester
24. april 2003 - 20:44 #1
her er et værktøj til konstrukion af din "magic packet"
http://www.depicus.com/wake-on-lan/wake-on-lan-gui.asp

Det er windows baseret, og gratis.

Der er også versioner til DOS

mvh :-)
Teknik
Avatar billede terry Ekspert
24. april 2003 - 20:46 #2
I think you will find all you need here.
http://www.depicus.com/wake-on-lan/
Avatar billede terry Ekspert
24. april 2003 - 20:47 #3
Too slow I see :o)
Avatar billede terry Ekspert
24. april 2003 - 20:48 #4
Your Motherboard must support WOL too!
Avatar billede kipolaks Nybegynder
24. april 2003 - 21:00 #5
hmmm, hvad hvis jeg selv vil programmere det i delphi??? (se kategori)
Avatar billede nca Juniormester
24. april 2003 - 21:12 #6
Jeg er med på en kikker :-)
Avatar billede stoney Nybegynder
24. april 2003 - 21:13 #7
Avatar billede teknik Juniormester
24. april 2003 - 21:19 #8
>poulseye - well, hvis man nu vil gøre tingene på den hårde måde, så vil man det. no prob.

Bemærkede ikke at spm. var under delphi. ;-)
Avatar billede dkn Nybegynder
24. april 2003 - 21:21 #9
Ved hjælp af winsock, kan desvære ikke huske om den virker.
Men du får nu bare alt koden...


unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSock;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
function CoCreateGuid(var guid: TGUID): HResult; stdcall; far external 'ole32.dll';

var
  Form1            : TForm1;
const
  LEN_PHYSADDR      = 6;
var
  WSAData          : TWSAData;
  MSocket          : TSocket;
  SockAddrIn        : TSockAddrIn;
  RetVal, OptVal, i : Integer;
  MacAddr          : array[0..5] of Byte;
  MagicData        : array[0..101] of Byte;
  SendPosition      : Longint;
  SAddr            : string;

implementation

{$R *.dfm}

function Get_MACAddress: string;
var
  g                : TGUID;
  i                : Byte;
begin
  Result := '';
  CoCreateGUID(g);
  for i := 2 to 7 do
    Result := Result + IntToHex(g.D4[i], 2);
end;


function CheckWinSockResult(ResultCode: Integer; const FuncName: string): Integer;
begin
  if ResultCode <> 0 then
  begin
    Result := WSAGetLastError;
    Form1.Label4.Caption := (Format(#13#10'Windows socket error: %s (%d), on API ''%s''.',
      [SysErrorMessage(Result), Result, FuncName]));
    Halt;
  end else Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    SAddr := Edit1.Text;
    if Length(SAddr) <> 17 then Abort;
    for i := 1 to Length(SAddr) do
      if i in [3, 6, 9, 12, 15] then
        if SAddr[i] <> '-' then Abort;

    for i := 0 to High(MacAddr) do
    begin
      if Pos('-', SAddr) > 0 then
        MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1))
      else
        MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr);
      Delete(SAddr, 1, Pos('-', SAddr));
    end;
  except
    Label4.Caption := 'Invalid Ethernet address';
    Halt;
  end;

  CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup');
  MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

  if MSocket = INVALID_SOCKET then
    CheckWinSockResult(MSocket, 'socket');

  OptVal := 1;

  CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST,
    PChar(@OptVal), SizeOf(OptVal)), 'setsockopt');

  FillChar(MagicData, SizeOf(MagicData), $FF);

  SendPosition := LEN_PHYSADDR;

  while SendPosition < SizeOf(MagicData) do
  begin
    Move(MacAddr, Pointer(Longint(@MagicData) + SendPosition)^, LEN_PHYSADDR);
    Inc(SendPosition, LEN_PHYSADDR);
  end;

  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST);

  RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn));

  if RetVal = SOCKET_ERROR then
    CheckWinSockResult(RetVal, 'sendto');

  CheckWinSockResult(closesocket(MSocket), 'closesocket');
  CheckWinSockResult(WSACleanup, 'WSACleanup');
  Label4.Caption := 'Magic Packet Send';
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MyMacAdr          : string;
begin
  MyMacAdr := Get_MACAddress;
  insert('-', MyMacAdr, 3);
  insert('-', MyMacAdr, 6);
  insert('-', MyMacAdr, 9);
  insert('-', MyMacAdr, 12);
  insert('-', MyMacAdr, 15);
  Edit1.Text := MyMacAdr;
end;

end.
Avatar billede kipolaks Nybegynder
24. april 2003 - 22:31 #10
Jeg giver mine point til stoney da han/hun var den første med et korrekt svar :) Jeg takker og bukker dybt! meeeen vi ses jo nok en anden gang!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester