2011-04-25 188 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

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

看看我的一个更全面的解释长评论。

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

相关问题