uses Winsock;
{远程唤醒函数 00-e0-4d-df-7e-8a}
procedure WakeUpPro(MacAddr: string);
var
WSAData : TWSAData;
MSocket : TSocket;
SockAddrIn : TSockAddrIn;
i : integer;
MagicAddr : array[0..5] of Byte;
MagicData : array[0..101] of Byte;
begin
for i := 0 to 5 do
MagicAddr[i] := StrToInt('$' + copy(MacAddr, i * 3 + 1, 2));
try
WSAStartup($0101, WSAData);
MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); //创建一个UPD数据报SOCKET.
if MSocket = INVALID_SOCKET then
exit;
i := 1;
setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST, PChar(@i), SizeOf(i)); //设置广播
FillChar(MagicData, SizeOf(MagicData), $FF);
i := 6;
while i < SizeOf(MagicData) do
begin
Move(MagicAddr, Pointer(Longint(@MagicData) + i)^, 6);
Inc(i, 6);
end;
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST);
sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn));
closesocket(MSocket);
WSACleanup;
except
on E: Exception do
//('WakeUpPro ' + MacAddr + ' except!' + E.Message);
end;
end;