基于Delphi的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。
procedure WakeUp(SAddr: string);
var
WSAData: TWSAData;
MSocket: TSocket;
SockAddrIn: TSockAddrIn;
RetVal, OptVal, i: Integer;
MacAddr: array[0..5] of Byte;
MagicData: array[0..101] of Byte;
Position: Longint;
begin
try
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 是删除一个 字符串中的 某部分字符
//Delete(str, index, count)
// str, //被删除的字符串
// index, //从第几个字符开始删除
// count //删除几个
//Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2、3.
//Pos(a,b); 取出子串a,在父串b中第一次出现的位置;
//Pos'b','abcd'); 返回结果是:2
Delete(SAddr, 1, Pos('-', SAddr));
end;
except
//application.MessageBox('网卡地址错误','警告',MB_ICONWARING); 错误:MB_ICONWARING
application.MessageBox('网卡地址错误', '警告', MB_ICONWARNING);
exit;
end;
try
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);
Position := LEN_PHYSADDR;
while Position < SizeOf(MagicData) do
begin
Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR);
Inc(Position, 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');
except
exit;
end;
end;