//远程唤醒函数,用到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