본문 바로가기
Delphi Tip/통신

Winapi.WinSock을 이용한 WOL(Wake On Lan) 구현

by MonoSoft 2024. 7. 2.
728x90
반응형

WinSock을 이용한 WOL(Wake On Lan) 구현

728x90

 

 

 

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock;

 

type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

i, mod_i, mSocket, optval: Integer;

s: string;

sSocket: TSockAddrIn;

Target: array[0..5] of Byte;

MagicPacket: array[0..101]of Byte;

begin

// 공백을 제거하여 문자열변수에 넣는다.

s := Trim(Edit1.Text);

 

// 소켓을 mSocket에 설치한다

mSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

 

// 소켓 옵션을 설정한다

optval := 1;

setsockopt(mSocket, SOL_SOCKET, SO_BROADCAST, @optval, SizeOf(optval));

// Broard Cast 주소를 소켓에 설정

sSocket.sin_family := AF_INET;

sSocket.sin_addr.S_addr := htonl($FFFFFFFF);

sSocket.sin_port := htons(60000);

// Magic Packet 생성

// MagicPacket[0..5] 에게 $FF Broard Cast 주소를 넣는다

for I := 0 to 5 do

begin

MagicPacket[i] := $FF;

end;

 

// Target 배열에 Mac 주소를 넣는다

for I := 0 to 5 do

begin

Target[i] := StrToInt('$' + Copy(s, 1, 2));

delete(s, 1, 3);

end;

 

// Mac 주소에 Target을 16번 반복해서 넣는다

for I := 6 to 101 do

begin

mod_i := i mod 6;

MagicPacket[i] := Target[mod_i];

end;

 

memo1.Lines.Add(IntToStr(SizeOf(MagicPacket)));

for I := 0 to SizeOf(MagicPacket) -1 do

begin

memo1.Lines.Add('MagicPacket[' + inttostr(i) + '] -> ' + Format('%.2x', [MagicPacket[i]]));

end;

 

// 패킷을 보낸다

sendto(mSocket, MagicPacket[0], SizeOf(MagicPacket), 0, sSocket, SizeOf(sSocket));

closesocket(mSocket); Memo1.Lines.Add('Magic Packet을 발송했습니다.');

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// 윈속 종료

WSACleanup;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

WSAData: TWSAData;

begin

// 윈속 시작

WSAStartup($101, WSAData);

end;

end.

 

728x90
반응형

댓글