delphi WinSock 局域网 唤醒电脑 根据 mac地址  
官方Delphi 学习QQ群: 682628230(三千人)\n
频道

delphi WinSock 局域网 唤醒电脑 根据 mac地址


delphi 局域网 唤醒电脑 根据 mac地址

uses
  WinSock, SysUtils;

procedure WakeOnLan(const MACAddress: string);
var
  Sock: TSocket;
  SockAddr: TSockAddrIn;
  WSAData: TWSAData;
  MagicPacket: array[0..101] of Byte;
  MACBytes: array[0..5] of Byte;
  i, j: Integer;
begin
  // 初始化 Winsock
  if WSAStartup($0202, WSAData) <> 0 then
    raise Exception.Create('WSAStartup failed');

  try
    // 创建 UDP 套接字
    Sock := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if Sock = INVALID_SOCKET then
      raise Exception.Create('Socket creation failed');

    try
      // 设置广播选项
      i := 1;
      if setsockopt(Sock, SOL_SOCKET, SO_BROADCAST, @i, SizeOf(i)) <> 0 then
        raise Exception.Create('setsockopt failed');

      // 设置目标地址
      SockAddr.sin_family := AF_INET;
      SockAddr.sin_port := htons(9); // WOL 默认端口
      SockAddr.sin_addr.S_addr := INADDR_BROADCAST;

      // 将 MAC 地址转换为字节数组
      for i := 0 to 5 do
        MACBytes[i] := StrToInt('$' + Copy(MACAddress, i * 2 + 1, 2));

      // 构建魔术包
      for i := 0 to 5 do
        MagicPacket[i] := $FF;
      for i := 1 to 16 do
        for j := 0 to 5 do
          MagicPacket[i * 6 + j] := MACBytes[j];

      // 发送魔术包
      if sendto(Sock, MagicPacket, SizeOf(MagicPacket), 0, SockAddr, SizeOf(SockAddr)) = SOCKET_ERROR then
        raise Exception.Create('sendto failed');
    finally
      closesocket(Sock);
    end;
  finally
    WSACleanup;
  end;
end;

// 示例调用
begin
  WakeOnLan('001122334455');
end;

这个代码使用 Windows API 函数来创建 UDP 套接字并发送魔术包。请确保你的局域网和目标电脑支持 Wake-on-LAN 功能,并且在 BIOS 或网卡设置中启用了该功能。


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.99666309356689 seconds