代码不错,不过有不能使用修改二个地方 一 修改下面的: for i:=0 to 5 do vBuf:=char($FF); 改为:for i:=0 to 5 do vBuf[i]:=char($FF); 二在下面前面加入一句NMUDP1.RemotePort:=4608; NMUDP1.RemoteHost:='192.168.1.255'; NMUDP1.SendBuffer(vBuf,Length(vBuf));
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;