- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
操作系统: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;
<小时/>
我根本不想使用任何 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/
这个问题在这里已经有了答案: android: broadcast receiver for screen on and screen off (2 个答案) 关闭 10 年前。 对于工业应用程序,
我想从另一个 pthread 中唤醒一个 pthread - 但需要一段时间。我知道 signal 或 pthread_signal 与 pthread_cond_wait 可用于唤醒另一个线程,但我
有谁知道我将如何唤醒 Wear 屏幕?我正在运行振动 API: Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
我读了Linux Kernel Development这本书,对 sleep 和唤醒部分给出的例子有一些疑问。 DEFINE_WAIT(wait); add_wait_queue(q, &wait);
我有 3 个进程需要同步。进程一做某事然后唤醒进程二并休眠,进程二做某事然后唤醒进程三并休眠,进程三做某事并唤醒进程一并休眠。整个循环定时运行大约 25hz(由外部同步到进程一之前触发我的“真实”应用
我正在研究一种解决方案,通过 Wake On Lan 激活机器,然后 System Center 将更新推送到客户端电脑(运行 Windows 7)。 现在我正在编写一个脚本 (PowerShell/
我有一个用 Rust 编写的 Web 服务器,我想将其部署在 Heroku 上。服务器在我的机器上本地编译和运行良好(见下图),但是,它无法在 Rust 上编译,我得到一个编译错误。 error[E0
我正在使用 Box2d v2.3 以下 box2d 方法采用 bool "wake": inline void b2Body::ApplyLinearImpulse(const b2Vec2& imp
许多 Prolog 系统都有 freeze/2谓词,谓词 应该有名称 geler/2因为它是 甚至在 Prolog-II 之前发明。 假设我对同一个变量有一个条件,但有两个 不同的目标,即: ?-
我有一个由 Azure 服务总线队列触发的 Azure Function - Azure Function App 托管在消费计划中。 当队列中出现新消息时,唤醒 Azure Function 最多需
我们有一个简单的 Azure 函数来进行 DocumentDB 查询。好像第一次调用要等很长时间才能完成,然后连续调用就很快了。 例如,我刚刚打开我们的应用程序,第一个函数调用花费了 10760 毫秒
我正在制作一款用户与计算机对战的游戏。轮到玩家时,计算机对手会考虑下一步行动。如果玩家移动到计算机对手计划移动的位置,计算机对手将重新开始搜索它的移动。 下面是主函数和对手函数的概要: [更新] pt
能否请您告诉我,如何为 Android 制作 Wake On Lan 应用程序?我在谷歌上搜索了两个星期,尝试了所有方法,从另一个局域网唤醒应用程序下载了源代码,并试图找到用于制作和发送魔术包的代码。
假设我有一个 Azure Webjob 配置为单例,并在自由站点上下文中“连续”运行。根据Azure specifications ,从开始的一段时间后,网络作业将关闭,除非有人让它继续运行: As
在某些计算机上,网络适配器默认配置为关闭“允许此设备唤醒计算机”选项。因此,LAN 唤醒将不起作用。 我需要重新打开此选项,但我无法手动完成 - 电脑太多了!因此,我需要能够通过 API 或脚本来完成
Mavericks 对我的应用程序有太多“空闲唤醒”很生气。我知道这与计时器和 OS X 试图使我的应用程序更省电的方式有关。我如何调试这些空闲唤醒?或者有哪些可能的原因? 最佳答案 可能的原因是线程
我正在尝试为生产者-消费者问题编写代码。下面的代码大部分时间都可以正常工作,但有时会因为“丢失唤醒”而卡住(我猜)。我尝试了 thread sleep() 但它没有用。在我的代码中处理这种情况需要进行
我有以下方法: def _attempt(actor): if actor.__class__ != User: raise TypeError 从 View 中调用: sel
当我的计算机从低功耗模式唤醒时, 光标消失。 当我关闭它时,会出现一个光标。 我正在使用其他加速应用程序。 最佳答案 我认为您应该清理系统缓存。 您可以为此使用合适的清洁程序。 关于windows-1
我有一个管理器类,多个线程将自己注册到该类(使用 UUID 为每个请求生成唯一标识符),提供要处理的有效负载并从管理器获得相应的响应。我正在使用 java.util.concurrent.Execut
我是一名优秀的程序员,十分优秀!