Freepascal で、IP アドレスの範囲をループするにはどうすればよいですか?
これを処理する可能性のあるIP固有のものを実行するユニットはありますか? inetaux と呼ばれるものを試しましたが、欠陥があり、機能しません。
Freepascal で、IP アドレスの範囲をループするにはどうすればよいですか?
これを処理する可能性のあるIP固有のものを実行するユニットはありますか? inetaux と呼ばれるものを試しましたが、欠陥があり、機能しません。
TLama のサンプルをより FPC スタイルで書き直しました。これもエンディアンセーフである必要があることに注意してください。
{$mode Delphi}
uses sockets;
procedure Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: in_addr;
begin
// loop in some range of IP addresses, here e.g. from 127.0.0.1 to 127.0.1.24
for I := 2130706433 to 2130706933 do
begin
IPAddress.s_addr:=i;
s:=HostAddrToStr(IPAddress);
....
end;
end;
IP アドレスは 4 バイトに分割された 32 ビットの数値にすぎないため、単純に整数を繰り返し、 for instanceabsolute
ディレクティブを使用してこのイテレータを 4 バイトに分割できます。
type
TIPAddress = array[0..3] of Byte;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: TIPAddress absolute I;
begin
// loop in some range of IP addresses, here e.g. from 127.0.0.1 to 127.0.1.245
for I := 2130706433 to 2130706933 do
begin
// now you can build from that byte array e.g. well known IP address string
S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
// and do whatever you want with it...
end;
end;
または、ビットごとのシフト演算子を使用して同じことを行うこともできますが、これにはもう少し作業が必要です。たとえば、上記と同じ例は次のようになります。
type
TIPAddress = array[0..3] of Byte;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
IPAddress: TIPAddress;
begin
// loop in some range of IP addresses, here e.g. from 127.0.0.1 to 127.0.1.245
for I := 2130706433 to 2130706933 do
begin
// fill the array of bytes by bitwise shifting of the iterator
IPAddress[0] := Byte(I);
IPAddress[1] := Byte(I shr 8);
IPAddress[2] := Byte(I shr 16);
IPAddress[3] := Byte(I shr 24);
// now you can build from that byte array e.g. well known IP address string
S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
// and do whatever you want with it...
end;
end;