2

尽管我知道我的 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 只能在不同的网络设备上看到我的测试服务器数据包. 关于发生了什么的任何想法?

4

1 回答 1

0

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

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

于 2012-12-11T10:42:31.267 回答