【发布时间】: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