⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wakeup.~pas

📁 远程开机
💻 ~PAS
字号:
unit WakeUp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, WinSock,
  StdCtrls,Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function CheckWinSockResult(ResultCode: Integer; const FuncName: string): Integer;
  end;

 const 
     LEN_PHYSADDR = 6;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

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;

procedure TForm1.Button1Click(Sender: TObject);
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;
  SAddr:string;
begin
  SAddr:=edit1.Text;//网卡的MAC地址
  //00-0d-61-93-20-dc
  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
        ShowMessage(#13#10'网卡地址错误.');
        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;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -