Создаю широковещательно сетевое приложение, рассылающее магический пакет на сетевые карты всех компьютеров в локальной сети. Цель как уже понятно пробудить клиентские машины сразу же после включения серверной. Задумка проста и хороша, ещё один шаг к автоматизации управления и абсолютной ленивости. Но не всё так здорово и классно как хотелось бы, как обычно возникают подводные камни. Для начала приведу свой код, смотрим ниже...
Код:
procedure WakeUpComputer(MacAddress: string);
var
FirstByte, SecondByte, ThirdByte: Byte;
Package: array of Byte;
UDPClientSocket: TIdUDPClient;
begin
Windows.Beep(10000, 100);
try
SetLength(Package, 102);
for FirstByte := 0 to 5 do
begin
Package[FirstByte] := $FF;
end;
for FirstByte := 1 to 16 do
begin
SecondByte := FirstByte * 6;
for ThirdByte := 0 to 5 do
begin
Package[SecondByte + ThirdByte] := HexToInt(MacAddress[ThirdByte * 2
+ 1] + MacAddress[ThirdByte * 2 + 2]);
end;
end;
UDPClientSocket := TIdUDPClient.Create(nil);
try
UDPClientSocket.BroadcastEnabled := True;
UDPClientSocket.Host := '255.255.255.255';
UDPClientSocket.Port := 2050;
UDPClientSocket.SendBuffer(Pointer(Package)^, 103);
except
on Problem: Exception do
begin
if MessageBox(0, 'Произошла ошибка при открытии соединения',
'Wake On LAN: Пробуждение сети', MB_ICONSTOP) = 1 then
begin
ExitProcess(0);
end;
end;
end;
UDPClientSocket.Free;
SetLength(Package, 0);
ExitProcess(0);
except
on Problem: Exception do
begin
if MessageBox(0, 'Произошла ошибка при генерации пакета',
'Wake On LAN: Пробуждение сети', MB_ICONSTOP) = 1 then
begin
ExitProcess(0);
end;
end;
end;
end;
Как видно из выше представленного куска кода - это знакомая многим до боли процедура посылающая магический пакет (WOL). Собственно в чём проблема, проблема в том что при вызове процедуры выскакивает последнее исключение: Произошла ошибка при генерации пакета.
Хм... Что же не так, то есть в чём мой косяк?
