尽管我知道我的 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/