function HexStringToBinString(const HexStr: string): string;
var
i, l: integer;
begin
Result := '';
l := length(HexStr);
l := l div 2;
SetLength(Result, l);
for i := 1 to l do
if HexToBin(PChar(Copy(HexStr, (i - 1) * 2 + 1, 2)),
PChar(@Result[i]), 1) = 0 then
raise Exception.Create('Invalid hex value');
end;
procedure SendMagicPacket(MACAddress: string);
var
s, packet: string;
i: integer;
begin
if Length(MACAddress) <> 12 then
raise Exception.CreateFmt('Invalid MAC Address: %s', [MACAddress]);
packet := HexStringToBinString('FFFFFFFFFFFF');
s := HexStringToBinString(MACAddress);
for i := 1 to 16 do
packet := packet + s;
with TIdUDPClient.Create(nil) do
try
Active := true;
BroadcastEnabled := true;
Broadcast(packet, 9);
finally
Free;
end;
end;
begin
if ParamCount <> 1 then
WriteLn('usage: WakeOnLan MACAddress' + #10 + #13 + 'exmple: WakeOnLan 000102030405')
else
SendMagicPacket(ParamStr(1));
end.
Программа на Delphi, использующая компонент клиента UDP Indy для отправки "магического пакета" для пробуждения компьютера на сети с помощью функциональности Wake-on-LAN BIOS.
Вот разбивка кода:
Первый раздел импортирует необходимые единицы и объявляет некоторые константы.
Функция HexStringToBinString принимает строку в формате hexadecimal как входной параметр и преобразовывает ее в строку в формате binary. Она делает это, перебирая входную строку по частям 2 символов (байты hex), конвертируя каждую часть в байт с помощью функции HexToBin и добавляя полученный байт в буфер.
Процедура SendMagicPacket принимает MAC-адрес как входной параметр и отправляет магический пакет для пробуждения соответствующего компьютера на сети. Она делает это, создавая экземпляр компонента TIdUDPClient, настройкой свойств Active, BroadcastEnabled и Broadcast для включения вещания, преобразованием MAC-адреса в строку binary с помощью функции HexStringToBinString, созданием пакета путем повторения MAC-адреса 16 раз, с каждым повторением состоящим из 6 байт (MAC-адрес), и отправкой пакета как вещательного сообщения на порт 9.
Основная часть программы проверяет, предоставлен ли пользователю одиночный аргумент командной строки (MAC-адрес). Если не предоставлен, она выводит ошибку и заканчивает работу. В противном случае она вызывает процедуру SendMagicPacket с предоставленным MAC-адресом.
Вот некоторые предложения по улучшению:
Обработка ошибок: код выбрасывает исключения при обнаружении недопустимого ввода, но не обрабатывает ошибки, которые могут возникнуть во время сетевого общения (например, таймауты соединения, потеря пакетов). Рассмотрите использование механизмов обработки ошибок, встроенных в Indy, для улучшения надежности.
Организация кода: процедура SendMagicPacket выполняет несколько DISTINCT задач: создание клиента UDP, отправку вещательного сообщения и очистку. Рассмотрите разбиение этой процедуры на более мелкие процедуры или функции для лучшей maintainability и readability.
Комментарии и документация: хотя код в целом хорошо документирован, некоторые разделы (например, функция HexStringToBinString) могут получить дополнительные комментарии, объясняющие их цель и поведение.
В целом, этоsolid реализация функциональности Wake-on-LAN с использованием Indy. С некоторыми минорными улучшениями она должна быть надежной и легко использовать.
Разбудить компьютер по сети с помощью Wake-on-LAN, используя BIOS и программу на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.