java - DatagramSocket 从不接收

标签 java networking udp

尽管我知道我的 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只能在不同的网络设备上看到我的测试服务器数据包。对正在发生的事情有什么想法吗?

最佳答案

好吧,这很尴尬。我为私有(private)和工作网络关闭了 Windows 防火墙 - 但事实证明 Windows 认为我实际上需要的是一个公共(public)网络...

现在可以正常使用了。我考虑过删除这个问题,但希望它能对其他布偶有所帮助。

关于java - DatagramSocket 从不接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13816890/

相关文章:

java - 在Android Studio中运行ExecutorService时出现类异常错误

html - websocket 消息可以乱序到达吗?

networking - 实时应用环境中的延迟和抖动有什么区别?

java - 如何在java中的笔记本电脑之间创建adhoc网络?

java - Minecraft - 漂浮元素消失了这个代码?

java - MediaRecorder 切断文件结尾

c# - 如何在 C# 中接收对 UDP 消息的 ICMP 响应 "Port unreachable"

java - 我们可以对 REST 服务进行 UDP 调用吗

java - 使用注释的 Hibernate View

java - 在UDP Socket java android上发送和接收数据