2011-04-25 183 views
1

我在客戶端的Java代碼庫上執行Maven構建,其中一個測試套件失敗。日誌中報告的錯誤與我在使用NetBeans調試器執行代碼時發現的錯誤相同。Java:DatagramSocket.send()失敗,發生「BindException:無法分配請求的地址」0.0.0.0

原生函數java.net.PlainDatagramSocketImpl.send()正在拋出一個BindException - 「無法分配請求的地址」。我不能更深入地介紹代碼,因爲它是本地函數。

在更高層次上,代碼正在執行網絡的基本測試。

DatagramSocket ds = new DatagramSocket(service.getNetworkConfiguration().getBindSocketAddress().getPort() + 100); 
InetSocketAddress bindSocketAddress = service.getNetworkConfiguration().getBindSocketAddress(); 
ds.send(new DatagramPacket(message, message.length, bindSocketAddress.getAddress(), bindSocketAddress.getPort())); 

的IP地址由service返回,因此包含在bindSocketAddress是,如前所述,0.0.0.0 - 我已經嘗試了不同的端口(32168,22332,1234),都具有相同的錯誤。

出現在DatagramSocket端口定義中的+ 100顯然是故意的,這個測試套件已經爲其他人取得了很長時間的成功,並且已經有了這個功能。

我在Windows 7,64位上運行。

我已經禁用了本地計算機上的防火牆和防病毒軟件,並且我運行了netstat -a,但在綁定端口列表中看不到任何端口。

這可能是我的Windows配置甚至我的路由器的問題?也許我的Java配置在某種程度上?任何建議將不勝感激。

後續操作:我在CentOS 5.5虛擬機上運行時收到IDENTICAL錯誤。但是,由於VM guest虛擬機正在Windows 7主機上運行,​​因此它仍然可能是Windows 7的配置問題 - 共享其Internet連接。 (橋接)

後續#2(見第4條評論):RECIPIENT似乎無效爲0.0.0.0;實際上,JDK(InetAddress.java)中的一條評論說:未指定地址(也稱爲匿名地址或通配符地址)不得用作通配符地址爲0.0.0.0的IP數據包的目標地址。我將代碼更改爲使用「localhost」(請參閱​​第4條評論)並解決了問題。但是,上述代碼可能因我不明白的原因而有效;當我向代碼開發人員澄清時,我會發布後續或答案。

更新(2012年3月1日):事實證明(事實上,有問題的代碼只是前面程序員部分的一個錯誤)。我真正的誤解與問題的主題完全無關。

解釋是:每次構建Java代碼時,我都會運行內置於系統中的關聯單元測試。那時我沒有意識到可以構建源代碼,但是可以繞過單元測試。事實證明,團隊中的另一位程序員已經構建了代碼(成功),但跳過了單元測試(並沒有注意到這個錯誤)。然後將代碼提交給源代碼控制,並相信它是正確的。其他程序員也習慣於在跳過單元測試的同時編寫代碼。因此,這個錯誤在幾個星期內沒有被發現。然而,我做了執行單元測試,並收到源代碼管理這個假設的工作代碼,但它仍然包含錯誤。我沒有向團隊中的其他人詢問有關錯誤的信息,因爲那時我相信我有責任充分理解Java而不需要花時間在團隊中的其他程序員,我認爲這是我的誤解,因爲我認爲其他人是沒有收到單元測試中的錯誤。

+0

你似乎使用bindSocketAddress作爲你想要發送數據包的主機,這是故意的嗎? – nos 2011-04-25 16:37:17

+0

@nos - 是的。 (這是我試圖構建和運行的代碼庫,爲了移過這個錯誤 - 我沒有寫 - 但是,這正是發生的情況,正如我從調試器中看到的那樣,其中'java .net.PlainDatagramSocketImpl.send()'失敗。) – 2011-04-25 16:42:49

+0

那麼這是一個邏輯錯誤 - 你需要弄清楚爲什麼誰寫這個想要發送消息到bindSocketAddress。儘管將綁定地址配置爲0.0.0.0是有意義的,因此您的套接字綁定到具有IP地址的所有接口,但嘗試將數據包發送到0.0.0.0是沒有意義的。也許你應該將綁定地址設置爲一個真實的本地IP地址,所以你可以發送數據包給自己? – nos 2011-04-25 21:05:28

回答

1

請參閱我的「更新」 - 這個問題是沒有意義的。

看看我的一個更全面的解釋長評論。

我在這裏留下問題,以避免在與問題本身無關的問題末尾的「更新」被某個被證明有用的人發現。

相關問題