Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取给定输入范围内每个ip地址的主机名_Delphi_Delphi 7 - Fatal编程技术网

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

Delphi 如何获取给定输入范围内每个ip地址的主机名,delphi,delphi-7,Delphi,Delphi 7,我的问题是如何获得所有ip地址的主机名,这些地址在给定的ip范围内。我知道从ip地址获取主机名的函数,但我只想知道如何从给定范围获取ip地址 例如: 输入在第一个'0.0.0.0'和第二个'1.1.1'中的两个EDIXbox中给出,因此我希望此范围内的所有ip地址 我已经尽力了,但是太复杂了。是否有任何函数或命令来获取给定范围之间的ip地址 function IPAddrToName(IPAddr: string): string; var SockAddrIn: TSockAddrIn

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

例如:

  • 输入在第一个
    '0.0.0.0'
    和第二个
    '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;
函数IPAddrToName(IPAddr:string):string;
变量
SockAddrIn:TSockAddrIn;
主持人:光能;
WSAData:TWSAData;
开始
WSAStartup(101美元,WSAData);
SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));
HostEnt:=GetHostByAddr(@SockAddrIn.sin_addr.S_addr,4,AF_INET);
如果没有,那么
开始
结果:=StrPas(主机名)
结束
其他的
开始
结果:='';
结束;
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
Label1.Caption:=IPAddrToName(Edit1.Text);
结束;

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

使用
inet\u 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\u addr
返回一个带有网络字节顺序的值。为了使循环工作,我们必须切换到主机字节顺序

这仅适用于跨越整个子网掩码的范围。例如,枚举192.168.1.0和192.168.1.255之间的所有地址是有意义的。但是,按照问题中的示例要求所有地址都在1.0.0.0和1.1.1.1之间是毫无意义的

因此,我认为您需要重新考虑并考虑迭代网络中的所有地址

您还可以在注释中询问如何从数字形式转换为虚线形式。为此,请使用
inet\u ntoa

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

谢谢,它正在工作,但它在给定范围内提供基数值,请您告诉我如何再次将基数值转换为ip。对不起,我是beginerUse
inet\u ntoa
。但你不需要这么做。更改
ipaddroname
以将ip地址作为
Cardinal
接收,您可以直接使用它,而不是
inet\u addr(PChar(IPAddr))
。一旦您从字符串转换为数字,请继续使用数字。我不明白您的意思,您能更新您的代码吗?我的目标是显示给定ip范围内的所有ip。无需进行其他计算。这不是您的问题所要求的。您询问如何获取范围内的所有IP地址。没有提到显示虚线形式。无论如何,正如我所说,您可以调用
inet\u ntoa
将数字转换为虚线。