Delphi从网络名称获取IP

时间:2015-04-16 18:12:04

标签: delphi networking delphi-xe5

好的伙计们,我已经挖掘和挖掘,包括在这个网站上,并且无法找到任何解决方案。

假设有几台计算机连接到网络,并且所有计算机都在同一个工作组中。我可以轻松获得所有网络名称的列表,例如// MYCOMPUTER-PC。我试图获取这些机器(不仅仅是当前机器)的所有本地IP地址,即192.168.0.1,而无需物理连接到每个可能的IP并测试连接。

到目前为止,我所尝试的一切都失败了。要么我只能获得我正在运行的机器的IP地址,要么我得到Searchguide(198.105.244.65)的IP地址,这是我的ISP默认无法找到IP地址的地址。

这里我使用的代码失败了。如果我在网络名称中留下\,我会得到一个未知的结果。如果我删除\我获得了Searchguide IP:

function GetIPAddress(NetworkName: String): String;
var
Error: DWORD;
HostEntry: PHostEnt;
Data: WSAData;
Address: In_Addr;
begin
     Error:=WSAStartup(MakeWord(1, 1), Data);
     if Error = 0 then 
     begin
          HostEntry:=gethostbyname(PansiChar(NetworkName));
          Error:=GetLastError();
          if Error = 0 then 
          begin
               Address:=PInAddr(HostEntry^.h_addr_list^)^;
               Result:=inet_ntoa(Address);
          end
          else 
          begin
               Result:='Unknown';
          end;
     end
     else
     begin
          Result:='Error';
     end;
     WSACleanup();
end;

所以,假设我对这些计算机所连接的路由器一无所知,甚至可以获得本地IP的列表???

由于

修改

这是它的输出图像

enter image description here

1 个答案:

答案 0 :(得分:2)

您正在使用XE5,字符串是unicode,您没有将主机名传递给gethostbyname,而是一些垃圾。取代

HostEntry:=gethostbyname(PansiChar(NetworkName));

HostEntry:=gethostbyname(PansiChar(AnsiString(NetworkName)));

另外测试gethostbyname的成功返回,而不是最后一次错误。使用api的文档正确使用。还可以使用WSAGetLastError来检索winsock错误代码(如文档所述),而不是GetLastError