gpt4 book ai didi

Java 网络问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:38:45 25 4
gpt4 key购买 nike

我们连接了一个路由器和 3 台电脑。

  1. PC1:192.168.1.2(无线)
  2. PC2:192.168.1.3(无线)
  3. PC3: 192.168.1.6

默认网关:192.168.1.1

当 PC3 尝试使用来自 this forum post 的代码查找已连接的 PC 时, 它只返回默认网关的 IP 地址(该地址是唯一可达的地址)。

我尝试增加 isReachable() 方法的超时时间。但它仍然只返回默认网关地址。

我尝试对各个 IP 地址执行此操作。

try {
InetAddress temp2 = InetAddress.getByAddress(new byte[]{(byte) 192, (byte) 168, (byte) 1, (byte) 2});
if (temp2.isReachable(1100)) {
java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has connection.");
}else{
java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has no connection.");
}
} catch (Exception ex) {
java.lang.System.out.println("Error: " + ex.getMessage());
}

然而,在那些 PC1 和 PC2 IP 地址上,我只得到一个无连接状态。 (这意味着无法访问这些 IP。)

但是当我在我的 Windows 控制台上 ping 它们时,这些 IP 已连接并且 ping 成功。

  1. 我的设置有什么问题。
  2. 我该如何解决这个问题。

最佳答案

我相信 Guido 在评论中的理论是正确的。参见 this question .我意识到链接的答案适用于 Linux/UNIX 主机,但我刚刚在 Windows 7 机器上测试了您的代码并验证它也将 TCP 数据包发送到 echo 端口 (7) 而不是ICMP 回应请求。 (我在 ver 报告 Microsoft Windows [Version 6.1.7600] 的 Windows 7 机器上在 Java 版本 1.6.0_21 下测试了这个)

典型的 Windows 机器可能会启用 Windows 防火墙。因此,可能会发生以下事件序列:

  1. 您的 Java 程序(无法发送和接收 ICMP 数据包来测试远程 Windows 主机的可达性)将尝试通过向端口发送 SYN(同步)数据包来启动到远程 Windows 主机的 TCP 连接7
  2. 远程 Windows 主机将丢弃数据包,而不是按照 RFC 793 的要求使用 RST 数据包进行响应。如果没有服务在该端口上监听。也就是说,根据 RFC,远程 Windows 主机应该已经用 TCP 响应:
  • RST:如果端口没有监听连接
  • SYN+ACK:如果端口打开并监听连接
  1. 由于您的 Java 程序期望在步骤 (2) 中发生两件事之一,但却没有得到任何响应(因为 Windows 在到达 TCP 堆栈之前丢弃了 SYN 数据包)它错误地假定远程 Windows主机已关闭。

很难说“您的设置有问题”是什么。也许什么都没有。这取决于您尝试将此功能用于什么目的。你可能会以错误的方式去做。您应该意识到 ping 并不总是 100% 准确地测试主机是否在线的方法。在您的情况下,如果您只对本地网络上的主机感兴趣,那么在尝试 ping 主机后检查 ARP 表可能会更准确。

可能的解决方法:

  • 尝试暂时关闭其中一台其他机器上的 Windows 防火墙,看看您的代码是否有效。
  • 编写一些执行单独进程的代码,例如运行 ping 命令行实用程序来测试可达性。

关于Java 网络问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5126697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com