【问题标题】:DatagramSocket never receivesDatagramSocket 从不接收
【发布时间】:2012-12-11 18:42:31
【问题描述】:

尽管我知道我的 UDP 数据包按预期到达(通过 Wireshark),并且关闭了 Windows 防火墙 - 我非常简单的 Java 代码从未收到任何数据包。

byte[] buffer = new byte[2048];
DatagramSocket socket = new DatagramSocket( 50000 );
DatagramPacket packet = new DatagramPacket( buffer, buffer.length );
socket.receive( packet );

我的机器上有 3 个网络适配器,所以我尝试非常具体地了解 IP。我尝试设置套接字以查看数据包到达的本地地址 - 没有收到任何东西。而且我还尝试将套接字连接到正在发送数据包的远程IP - 没有收到任何东西。一直以来,Wireshark 都在看到每秒所有 160 个数据包到达......

我唯一的另一个想法是我没有计算发送端的 UDP 校验和(UDP 数据包是在嵌入式系统上“手动”组装的),它只是被设置为 0x0000 - DatagramSocket 丢弃没有校验和的UDP数据包!?


我根据@Andreas 的建议编写了一个简单的测试服务器来帮助诊断问题。

InetAddress outAddr = InetAddress.getLocalHost();
InetAddress inAddr = InetAddress.getByName( "192.178.178.0" );

byte[] buffer = ( "Hello" ).getBytes();
DatagramSocket socket = new DatagramSocket( 50000, outAddr );
while ( true ) {
    DatagramPacket packet = new DatagramPacket( buffer, buffer.length, 
                                                inAddr, 50000 );
    socket.send( packet );

    try {
        Thread.sleep( 500 );
    } catch ( InterruptedException e ) {
        // Ignore.
    }
}

Wireshark 尽职尽责地指出它正在接收它们 - 但我的客户端仍然没有,即使接收 IP 已明确设置:

InetAddress inAddr = InetAddress.getByName( "192.178.178.0" );
DatagramSocket socket = new DatagramSocket( 50000, inAddr );
...
socket.receive( packet );

我刚刚注意到一些奇怪的事情,当我检查哪个NetworkInterface 用于发送和接收时,Java 会报告正确的那个(“拥有”192.178.178.0 的那个)——但是 Wireshark 只看到我的测试服务器不同网络设备上的数据包。有什么想法吗?

【问题讨论】:

  • 您对这个套接字的防火墙设置是什么?我怀疑wireshark 可以看到你的操作系统防火墙之外的东西。
  • 您是否考虑过在 Java 中实现一个简单的 UDP 发送方来检查您的数据包接收代码是否正常工作?据我所知,UDP校验和是可选的——如果它是0,它应该被忽略
  • @PeterLawrey Windows 防火墙已关闭,它直接连接到嵌入式系统中的交换机 - 没有硬件或软件防火墙。
  • @Andreas 我拼凑了一个简单的应用程序,它发送和接收 UDP 消息,它工作了 - 但 Wireshark 从来没有看到任何数据包!所以我把它丢弃了。但你是对的,为我的“正确”代码创建服务器绝对是一个很好的测试想法。
  • 如果您侦听看到数据包发送到的 IP 地址会发生什么。我怀疑 DatagramSocket 绑定到您的默认接口,并且只监听一些 IP 地址,而不是全部用于该端口。

标签: java networking udp


【解决方案1】:

好吧,这很尴尬。我为私人和工作网络关闭了 Windows 防火墙 - 但事实证明 Windows 被认为是我真正需要的公共网络......

现在可以正常使用了。我考虑删除这个问题,但希望它会帮助其他一些布偶。

【讨论】:

  • 您应该接受这个答案以表明问题已经解决。
  • 还有两天的等待期才让我。
  • @cmannett85 你所说的“Windows 认为我真正需要成为公共网络的那个”到底是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2012-01-08
相关资源
最近更新 更多