//远程唤醒函数,用到winsock单元
procedure TForm1.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(SAddr, 1, Pos('-', SAddr));
end;
except
application.MessageBox('网卡地址错误','警告',MB_ICONWARING);
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;
//错误时进行提示
function TForm1.CheckWinSockResult(ResultCode: Integer;
const FuncName: string): Integer;
begin
if ResultCode <> 0 then
begin
Result := WSAGetLastError;
ShowMessage(Format(#13#10'Windows socket函数''%s''错误: %s (%d)',[FuncName,SysErrorMessage(Result), Result]));
Abort;
end else Result := 0;
end;
//delphi/6839