gpt4 book ai didi

delphi - 如何在Delphi XE6中使用Magic packet和Indy创建Wake-on-LAN应用程序?

转载 作者:行者123 更新时间:2023-12-02 00:51:22 24 4
gpt4 key购买 nike

环境

操作系统:Windows 10 专业版 64 位

IDE:Delphi XE6 + 更新 1

<小时/>

目标

在Delphi XE6中创建一个应用程序发送Magic packet通过Indy组件从而实现Wake-on-LAN本地服务器。服务器经过测试能够从 Linux 客户端唤醒。

请注意,我想创建自己的解决方案,请不要提供应用程序建议。谢谢。

<小时/>

魔法包

引用 Wikipedia article 的部分内容:

The magic packet is a broadcast frame containing anywhere within its payload 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal), followed by sixteen repetitions of the target computer's 48-bit MAC address, for a total of 102 bytes.

<小时/>

基础版本

我从 this page 获得了基础版本.

作者没有提及他使用的是哪个版本的 Delphi,我们假设是较旧的版本。

我会引用它,以防页面不可用,不变:

procedure WakeOnLan(const AMacAddress : string);
type
TMacAddress = array [1..6] of byte;

TWakeRecord = packed record
Waker : TMACAddress;
MAC : array[0..15] of TMACAddress;
end;

var i : integer;
WR : TWakeRecord;
MacAddress : TMacAddress;
UDP : TIdUDPClient;
sData : string;
begin
// Convert MAC string into MAC array
fillchar(MacAddress,SizeOf(TMacAddress),0);
sData := trim(AMacAddress);

if length(sData) = 17 then begin
for i := 1 to 6 do begin
MacAddress[i] := StrToIntDef('$' + copy(sData,1,2),0);
sData := copy(sData,4,17);
end;
end;

for i := 1 To 6 do WR.Waker[i] := $FF;
for i := 0 to 15 do WR.MAC[i] := MacAddress;
// Create UDP and Broadcast data structure
UDP := TIdUDPClient.Create(nil);
UDP.Host := '255.255.255.255';
UDP.Port := 32767;
UDP.BroadCastEnabled := true;
UDP.SendBuffer(WR,SizeOf(TWakeRecord));
UDP.BroadcastEnabled := false;
UDP.Free;
end;
<小时/>

但是Delphi XE6的编译器在线提示:

UDP.SendBuffer(WR,SizeOf(TWakeRecord));

它说:

[dcc64 Error] main.pas(73): E2250 There is no overloaded version of 'SendBuffer' that can be called with these arguments
<小时/>

我的版本

重写上面的代码以获得更好的可读性+我尝试了各种无法编译的方法,最后这个方法确实可以编译,尽管它显然不起作用(不会唤醒服务器)。

procedure WakeOnLan(const AMacAddress: string);

type
TMacAddress = array [1..6] of Byte;

TWakeRecord = packed record
Waker : TMACAddress;
MAC : array [0..15] of TMacAddress;
end;

var
I : Integer;
WR : TWakeRecord;
MacAddress : TMacAddress;
UDPClient : TIdUDPClient;
sData : string;

begin
FillChar(MacAddress, SizeOf(TMacAddress), 0);

sData := Trim(AMacAddress);

if Length(sData) = 17 then begin

for I := 1 to 6 do begin
MacAddress[I] := StrToIntDef('$' + Copy(sData, 1, 2), 0);
sData := Copy(sData, 4, 17);
end;

end;

for I := 1 to 6 do WR.Waker[I] := $FF;
for I := 0 to 15 do WR.MAC[I] := MacAddress;

UDPClient := TIdUDPClient.Create(nil);
try

// UDP.Host := '255.255.255.255';
// UDP.Port := 32767;

UDPClient.BroadCastEnabled := True;
UDPClient.Broadcast(RawToBytes(WR, SizeOf(TWakeRecord)), 7);

// UDP.SendBuffer(RawToBytes(WR, SizeOf(TWakeRecord)));

UDPClient.BroadcastEnabled := False;
finally
UDPClient.Free;
end;
end;
<小时/>

编辑1

我根本不想使用任何 IP 地址,只需使用纯 MAC 地址即可。

最佳答案

原始代码是为 Indy 9 编写的。Indy 10 的等效代码看起来更像是这样:

UDPClient := TIdUDPClient.Create(nil);
try
UDP.Host := '255.255.255.255';
UDP.Port := 32767;
UDP.IPVersion := Id_IPv4;
UDP.BroadcastEnabled := True;
UDP.SendBuffer(RawToBytes(WR, SizeOf(WR)));
finally
UDP.Free;
end;

或者:

UDPClient := TIdUDPClient.Create(nil);
try
UDP.IPVersion := Id_IPv4;
UDP.BroadCastEnabled := True;
UDP.SendBuffer('255.255.255.255', 32767, RawToBytes(WR, SizeOf(WR)));
finally
UDP.Free;
end;

或者:

UDP := TIdUDPClient.Create(nil);
try
UDP.IPVersion := Id_IPv4;
UDP.Broadcast(RawToBytes(WR, SizeOf(WR)), 32767);
finally
UDP.Free;
end;

关于delphi - 如何在Delphi XE6中使用Magic packet和Indy创建Wake-on-LAN应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com