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