2013-03-16 53 views
1

在Freepascal中,我如何循環訪問一系列IP地址?通過ip地址循環pascal

任何單位,做ip特定的東西,可能會處理這個?我試過一個名爲inetaux,但它有缺陷並且不起作用。

+1

您是否還需要IPv6支持? – Thomas 2013-03-16 03:39:29

+0

@Thomas,只是ipv4。 – 2013-03-16 04:01:09

回答

1

由於IP地址就是分裂成4個字節的32位數字,你可以簡單地重複一個整數,並使用例如absolute指令,這個迭代器分成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; 
+0

謝謝TLana!順便說一句,你有一些編程技巧! – 2013-03-16 18:59:10

+0

很高興能幫到你! – TLama 2013-03-17 04:04:34

1

我重寫了更多FPC樣式的TLama樣本。請注意,這也應該是安全的:

{$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;