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.