2011-02-26 113 views
3

我們有一臺路由器和3臺PC相連。Java網絡問題

  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. 我該如何解決這個問題。
+0

你是在unix系統上運行的嗎? – 2011-02-26 11:57:10

+0

不,我在Windows Vista上運行它基礎知識os – 2011-02-26 12:40:26

+1

成功的Windows控制檯ping的平均ping時間是多少?什麼是第一次ping時間?如果您的第一次ping時間大於1100,isReachable()將超時並返回false。 – nrobey 2011-02-26 13:57:58

回答

2

相信圭多是與他的意見理論上是正確。見this question。我知道鏈接的答案適用於Linux/UNIX主機,但我只是測試了Windows 7的機器上的代碼,並驗證了它,還發送TCP數據包到echo口(7),而不是ICMP迴應請求。 (我在Windows 7盒子上的Java版本1.6.0_21上進行了測試,其中ver報告爲Microsoft Windows [Version 6.1.7600]

典型的Windows機器可能啓用Windodws防火牆。因此,下面的事件序列可能是:

  1. 你的Java程序(不能夠發送和接收ICMP數據包測試遠程Windows主機的可達性)將嘗試發起TCP連接到遠程Windows主機,通過發送一個SYN(同步)數據包到端口7
  2. 遠程Windows主機將丟棄該數據包,而不是所要求的RFC 793如果沒有服務是端口上偵聽一個RST包響應。也就是說,遠程Windows主機應該有,按照RFC,要麼報以TCP:
    • RST:如果端口沒有被監聽連接
    • SYN + ACK:如果端口是開放的並監聽連接
  3. 由於您的Java程序期望在步驟(2)中發生兩件事情之一,但卻根本沒有響應(因爲Windows在到達TCP堆棧之前丟棄了SYN數據包)它錯誤地假定遠程Windows主機關閉。

很難說「你的設置有問題」是什麼。也許沒什麼。這取決於您試圖使用此功能的原因。你可能會用錯誤的方式去解決它。您應該認識到,ping並不總是100%準確的方式來測試主機是否在線。就你而言,在嘗試ping主機後檢查ARP表可能更準確,如果你只對本地網絡上的主機感興趣。

可能的解決方法:

  • 嘗試關閉Windows防火牆暫時在其他機器之一,看看你的代碼工作。
  • 編寫一些執行單獨進程的代碼,例如運行ping命令行實用程序來測試可訪問性。
+0

不完全。由於連接被拒絕並且數據包說明不正確,所以isReachable()假定主機關閉。如果它有一個RST,它會認爲主機是* * – EJP 2011-02-28 02:25:58

+0

@EJP,我想這就是我所說的。 ;-)如果您覺得不夠清楚,請隨時編輯我的答案。 – mpontillo 2011-02-28 04:17:19

+0

@EJP,謝謝你的努力。 ;-)你激勵我完全重寫答案的那一部分。現在更清楚了嗎? – mpontillo 2011-02-28 08:46:53