我的问题是如何获取所有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;
答案 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地址。