![使用什么IP进行自测?](https://linux22.com/image/663887/%E4%BD%BF%E7%94%A8%E4%BB%80%E4%B9%88IP%E8%BF%9B%E8%A1%8C%E8%87%AA%E6%B5%8B%EF%BC%9F.png)
一组服务器在特定端口上提供功能(该端口监听所有接口)。服务器必须通过连接自身来自我测试其自身功能。测试连接应使用什么 DNS 名称或 IP?
理想情况下,我会使用其中一个本地 IP 并完成它(例如“192.13.1.5”)。但是,获取本地 IP 列表对于测试代码来说很困难。
我可以使用“localhost”(127.0.0.1),但这会使用环回接口并绕过网络硬件。这让我想到...
问题:有没有简写形式“此服务器使用的任何本地 IP”?(环回地址除外)。
在 Linux 上使用“0.0.0.0”似乎有效,但在 Windows 上无效。
答案1
除了 Michael Hampton 的建议外,Windows 应该将其识别%computername%
为环境变量,您可以对其进行 ping 等操作。
在我看来,PowerShell cmdletTest-NetConnection
和 Windows 环境变量可能会满足您的要求。您可以指定一个端口,但由于您没有提到端口,所以我只使用了
Test-NetConnection -ComputerName $env:COMPUTERNAME
在我的笔记本电脑上,这个方法运行良好。检查端口 135 的端口语法(随机示例)如下:
Test-NetConnection -Port 135 -ComputerName $env:COMPUTERNAME
答案2
谢谢大家 - 非常感谢你们的帮助。是的,主机名环境变量可以工作,但需要代码才能访问。我同意 Shane - 0.0.0.0应该有效,但也有一些棘手的事情。
我认为我需要编写代码(必须是 Java),因此我编写了这个来获取三组 IP:
List<String> IPAddress = new ArrayList<String>();
List<String> NonLoopbackIPv4Address = new ArrayList<String>();
List<String> NonLoopbackIPv6Address = new ArrayList<String>();
try {
Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
while(en.hasMoreElements()){
NetworkInterface ni=(NetworkInterface) en.nextElement();
Enumeration<InetAddress> ea = ni.getInetAddresses();
while(ea.hasMoreElements()) {
InetAddress ia= (InetAddress) ea.nextElement();
//Add entries to the overall address array
IPAddress.add(ia.getHostAddress());
//Add entries to non-loopback IPv4 address array
if (!ia.isLoopbackAddress() && (ia.getClass() == Inet4Address.class)) {
NonLoopbackIPv4Address.add(ia.getHostAddress());
}
//Add entries to non-loopback IPv6 address array
if (!ia.isLoopbackAddress() && (ia.getClass() == Inet6Address.class)) {
NonLoopbackIPv6Address.add(ia.getHostAddress());
}
}
}
} catch (Exception e) {
//catch and process necessary exceptions, etc...
throw new Exception (e);
}
...在哪里:
- IPAddress - 此主机的所有 IP 地址列表(v4 和 v6),包括绑定到环回接口的 IP 地址
- NonLoopbackIPv4Address - 此主机的所有 IPv4 地址列表,不包括绑定到环回接口的地址
- NonLoopbackIPv6Address - 此主机的所有 IPv6 地址列表,不包括绑定到环回接口的地址