Delphi 如何获取给定输入范围内每个ip地址的主机名
我的问题是如何获得所有ip地址的主机名,这些地址在给定的ip范围内。我知道从ip地址获取主机名的函数,但我只想知道如何从给定范围获取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
- 输入在第一个
和第二个'0.0.0.0'
中的两个EDIXbox中给出,因此我希望此范围内的所有ip地址'1.1.1'
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
将数字转换为虚线。