Java:DatagramSocket.send()失败,出现“BindException:无法为0.0.0.0分配请求的地址”

时间:2011-04-25 16:18:30

标签: java sockets windows-7

我在客户端的Java代码库上执行Maven构建,其中一个测试套件失败了。日志中报告的错误与我使用NetBeans调试器逐步执行代码时发现的错误相同。

本机函数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()));

service返回的,因此包含在bindSocketAddress中的IP地址是0.0.0.0 - 我尝试过不同的端口(32168,22332,1234),所有这些都有相同的错误

+ 100端口定义中出现的DatagramSocket显然是有意的,并且这个测试套件已经成功地为其他人成功了。

我在64位Windows 7上运行。

我已在本地计算机上禁用了防火墙和防病毒软件,并且我已运行netstat -a,但我没有看到我在绑定端口列表中使用过的任何端口。

这可能是我的Windows配置甚至路由器的问题吗?也许我的Java配置在某种程度上?任何建议都将受到高度赞赏。

跟进:在CentOS 5.5虚拟机上运行时收到IDENTICAL错误。但是,它仍然可能是Windows 7配置问题,因为VM guest虚拟机正在Windows 7主机上运行 - 共享其Internet连接。 (桥接)

跟进#2(见第4条评论):将RECIPIENT设为0.0.0.0似乎无效;事实上,JDK(InetAddress.java)中的注释说:未指定的地址(也称为anylocal或通配符地址)不得用作IP包的目标地址,其中通配符地址为0.0.0.0。我将代码更改为使用“localhost”(参见第4条评论),它解决了问题。但是,上述代码可能因我不理解的原因而有效;当我向代码的开发者澄清时,我会发布一个后续或答案。

更新(2012年3月1日):事实证明(回想起来)实际上,有问题的代码只是以前程序员部分的一个错误。我真正的误解与问题的主题完全无关。

解释是:每次构建Java代码时,我都会运行系统内置的相关单元测试。当时我没有意识到可以构建源代码,但绕过了单元测试。事实证明,团队中的另一个程序员已经构建了代码(成功),但跳过了单元测试(并没有注意到这个错误);然后将代码提交给源代码控制,相信它是正确的。其他程序员也习惯于在跳过单元测试的同时构建代码。因此,该漏洞几周没有被捕获。但是,我做了执行单元测试,并从源代码控制中接收到这个可能正常工作的代码,同时它仍然包含bug。我没有向团队中的其他人询问有关这个bug的事情,因为当时我认为我有责任充分理解Java,而不需要花费团队中其他程序员的时间,我认为这是我的误解,因为我认为其他人是没有在单元测试中收到错误。

1 个答案:

答案 0 :(得分:1)

请参阅我的“更新” - 这个问题没有实际意义。

请查看我的长篇评论,以获得更全面的解释。

我在这里留下这个问题,以防问题末尾的“更新”与问题本身的主题无关,是由被证明有用的人发现的。