首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java网络问题

Java网络问题
EN

Stack Overflow用户
提问于 2011-02-26 11:46:38
回答 1查看 686关注 0票数 3

我们有一个路由器和3台PC相连。

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

默认网关: 192.168.1.1

当PC3试图使用来自这个论坛帖子的代码查找连接的PC时,它只返回默认网关的IP地址(该地址是唯一可访问的地址)。

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

我试着对个人IP地址做这个。

代码语言:javascript
复制
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是不可触及的。)

但是当我在我的窗口控制台上点击它们时,这些is是连接的,点击是成功的。

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

回答 1

Stack Overflow用户

发布于 2011-02-27 23:32:40

我相信guido在评论中的理论是正确的。见这个问题。我意识到链接的答案适用于Linux/UNIX主机,但我只是在一台Windows 7计算机上测试了您的代码,并验证了它也将TCP数据包发送到echo端口(7),而不是ICMP回送请求。(我在Java版本的1.6.0_21环境下在ver报告了Microsoft Windows [Version 6.1.7600]的Windows 7机顶盒上进行了测试)

一台典型的Windows机器很可能启用Windows防火墙。因此,可能会出现以下一系列事件:

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

很难说“你的设置有什么问题”。也许什么都没有。这取决于您尝试使用此功能的目的。你可能走错路了。您应该认识到,ping并不总是一种100%准确的测试主机是否在线的方法。在您的示例中,如果您只对本地网络上的主机感兴趣,那么在尝试ping主机之后检查ARP表可能更准确。

可能的解决办法:

  • 试着在另一台机器上暂时关闭Windows防火墙,看看您的代码是否有效。
  • 编写一些执行单独进程的代码,例如运行ping命令行实用程序来测试可达性。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5126697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档