При работе с сетью часто возникает необходимость пройтись по диапазону IP-адресов. В этом материале мы рассмотрим, как это можно сделать в FreePascal.
IP-адрес представляет собой 32-битное число, разделенное на 4 байта. Поэтому, чтобы пройтись по диапазону IP-адресов, достаточно пройтись по диапазону целых чисел и разделить каждое число на 4 байта.
Пример кода на Object Pascal (Delphi), который демонстрирует, как это можно сделать:
type
TIPAddress = array[0..3] of Byte;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: TIPAddress absolute I;
begin
// цикл по диапазону IP-адресов от 127.0.0.1 до 127.0.1.245
for I := 2130706433 to 2130706933 do
begin
// преобразование целого числа в массив байтов
IPAddress := I;
// построение строки IP-адреса из массива байтов
S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
// дальнейшая обработка строки IP-адреса
// ...
end;
end;
Также можно использовать битовый сдвиг, но это требует больше усилий:
type
TIPAddress = array[0..3] of Byte;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: TIPAddress;
begin
// цикл по диапазону IP-адресов от 127.0.0.1 до 127.0.1.245
for I := 2130706433 to 2130706933 do
begin
// заполнение массива байтов путем сдвига битов целого числа
IPAddress[0] := Byte(I);
IPAddress[1] := Byte(I shr 8);
IPAddress[2] := Byte(I shr 16);
IPAddress[3] := Byte(I shr 24);
// построение строки IP-адреса из массива байтов
S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
// дальнейшая обработка строки IP-адреса
// ...
end;
end;
Также можно использовать модуль sockets, который предоставляет функцию HostAddrToStr, которая преобразует IP-адрес в строку:
{$mode Delphi}
uses
sockets;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: in_addr;
begin
// цикл по диапазону IP-адресов от 127.0.0.1 до 127.0.1.245
for I := 2130706433 to 2130706933 do
begin
// преобразование целого числа в IP-адрес
IPAddress.s_addr := I;
// построение строки IP-адреса с помощью функции HostAddrToStr
S := HostAddrToStr(IPAddress);
// дальнейшая обработка строки IP-адреса
// ...
end;
end;
В заключение стоит отметить, что при работе с IPv6 адресами может потребоваться другой подход, так как они представляют собой 128-битные числа, разделенные на 8 блоков по 16 бит.
Материал описывает, как пройтись по диапазону IP-адресов в FreePascal, представленных как 32-битные числа, разделив их на 4 байта.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.