如何在给定的输入范围内获取每个IP地址的主机名

时间:2014-08-25 17:29:30

标签: delphi delphi-7

我的问题是如何获取所有IP地址的主机名,这些地址都是在ip范围内给出的。我知道从ip地址获取主机名的功能,但我只想知道如何从给定范围获取IP地址

示例:

  • 输入在第一个'0.0.0.0'和第二个'1.1.1.1'中的两个edixbox中给出,所以我想要在此范围之间的所有IP地址...

我尽我所能但是太复杂了。是否有任何函数或命令来获取给定范围之间的IP地址?

function IPAddrToName(IPAddr: string): string;
var
  SockAddrIn: TSockAddrIn; 
  HostEnt: PHostEnt;
  WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
  HostEnt := GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt<>nil then
  begin
    Result := StrPas(Hostent^.h_name)
  end
  else
  begin
    Result := '';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IPAddrToName(Edit1.Text);
end;

2 个答案:

答案 0 :(得分:3)

使用inet_addr将IP地址的虚线文本格式转换为无符号32位整数。对两个地址都这样做。然后使用简单的for循环从一个循环到另一个循环。

var
  ip, ip1, ip2: Cardinal;
....
ip1 := ntohl(inet_addr(PChar(edit1.Text)));
ip2 := ntohl(inet_addr(PChar(edit2.Text)));
for ip := min(ip1,ip2) to max(ip1,ip2) do
  // use ip

我跳过任何验证。你不会。另请注意,inet_addr返回具有网络字节顺序的值。要使循环起作用,我们必须切换到主机字节顺序。

这对跨越整个子网掩码的范围才有意义。例如,枚举192.168.1.0和192.168.1.255之间的所有地址是有意义的。但根据你问题中的例子,要求1.0.0.0和1.1.1.1之间的所有地址完全没有意义。

所以我认为你需要重新考虑并考虑迭代网络中的所有地址。

您还可以在评论中询问如何从数字形式转换为虚线形式。请使用inet_ntoa

var 
  addr: in_addr;
  dottedAddr: string;
....
addr.S_addr := htonl(ip);
dottedAddr := inet_ntoa(addr);

答案 1 :(得分:1)

生成IP地址并不复杂。只需将范围边界转换为4字节整数,然后在边界之间进行迭代。请特别注意字节顺序,以便将整数正确转换为IP地址。