好的伙计们,我已经挖掘和挖掘,包括在这个网站上,并且无法找到任何解决方案。
假设有几台计算机连接到网络,并且所有计算机都在同一个工作组中。我可以轻松获得所有网络名称的列表,例如// 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的列表???
由于
修改的
这是它的输出图像
答案 0 :(得分:2)
您正在使用XE5,字符串是unicode,您没有将主机名传递给gethostbyname
,而是一些垃圾。取代
HostEntry:=gethostbyname(PansiChar(NetworkName));
与
HostEntry:=gethostbyname(PansiChar(AnsiString(NetworkName)));
另外测试gethostbyname
的成功返回,而不是最后一次错误。使用api的文档正确使用。还可以使用WSAGetLastError
来检索winsock错误代码(如文档所述),而不是GetLastError
。