【问题标题】:Delphi get IP from network nameDelphi从网络名称获取IP
【发布时间】:2015-04-16 18:12:03
【问题描述】:

好吧,伙计们,我已经挖了又挖,包括在这个网站上,但找不到任何解决方案。

假设多台计算机连接到网络并且都在同一个工作组中。我可以轻松获得他们所有网络名称的列表,例如 //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 的列表???

谢谢

编辑

这是它的输出图像

【问题讨论】:

    标签: delphi networking delphi-xe5


    【解决方案1】:

    您使用的是 XE5,字符串是 unicode,您没有将主机名传递给 gethostbyname,而是一些垃圾。替换

    HostEntry:=gethostbyname(PansiChar(NetworkName));
    

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


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

    【讨论】:

    • 好的,试过了。从获得网络上的所有计算机到 198.105.244.65 到除了我所在的计算机之外的所有计算机,它列出了正确的 IP。其他的仍然是 Searchguide 的 IP
    • 您正在传递 DNS 名称,不是吗?不是 //MYCOMPUTER-PC 或 \\MYCOMPUTER-PC 而是 MYCOMPUTER-PC
    • 刚刚添加了一个屏幕截图来向您展示它在做什么。
    • 你确定地址是可解析的,用 nslookup 测试过?
    • 你应该将你的结果与你在命令提示符下执行“ping MYCOMPUTER-PC”得到的结果进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2013-06-21
    • 2017-04-10
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多