如何通过互联网使用Wake-On-Lan唤醒办公室电脑?
问题
我想在家中移动设备的应用里,向办公室的电脑发送Wake-On-Lan数据包。以下代码在连接办公室网络时能正常运行:
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 UDPClient.Host := '255.255.255.255'; UDPClient.Port := 32767; UDPClient.BroadCastEnabled := True; UDPClient.Broadcast(RawToBytes(WR, SizeOf(TWakeRecord)), 7); UDPClient.SendBuffer(RawToBytes(WR, SizeOf(TWakeRecord))); UDPClient.BroadcastEnabled := False; finally UDPClient.Free; end; end;
但在家中网络环境下无法正常工作,请问我该如何在发送魔术包前连接办公室调制解调器/电脑?是否需要使用TSocket替代TIdUDPClient?
解决方案
不需要替换成TSocket,TIdUDPClient完全满足需求,问题核心是跨网络WOL的实现逻辑,而非组件选择:
配置办公室路由器端口转发
家中网络无法直接向办公室局域网发送广播包,必须在办公室路由器/调制解调器上设置端口转发:- 将外部UDP端口(与代码中一致的32767)转发至办公室局域网的广播地址(通常为
192.168.x.255,需根据实际网段调整) - 确保路由器UPnP功能不会干扰自定义的转发规则
- 将外部UDP端口(与代码中一致的32767)转发至办公室局域网的广播地址(通常为
修改代码中的目标地址
把代码里的广播地址255.255.255.255替换为办公室路由器的公网IP地址或绑定了公网IP的动态域名(DDNS),同时关闭广播模式(跨网无需广播,直接发送至公网地址即可)。修改后的核心代码片段:UDPClient := TIdUDPClient.Create(nil); try UDPClient.Host := '办公室公网IP/DDNS域名'; // 替换为实际地址 UDPClient.Port := 32767; // 无需开启BroadcastEnabled,直接发送魔术包 UDPClient.SendBuffer(RawToBytes(WR, SizeOf(TWakeRecord))); finally UDPClient.Free; end;额外检查项
- 确认办公室电脑的BIOS/UEFI已开启Wake-On-Lan功能,且系统网卡属性中启用了“允许此设备唤醒计算机”选项
- 办公室防火墙需允许UDP端口32767的入站流量
- 若办公室使用动态公网IP,建议配置DDNS服务自动更新域名对应IP
内容的提问来源于stack exchange,提问作者Ghost_Dz
相关产品推荐
相关产品推荐

