Java DatagramSocket能够在Windows上接收数据包,但不能使用Linux

请注意,在这个线程海报似乎有一个与我的问题: DatagramSocket广播行为(Windows与Linux)不幸的是,这个职位死亡没有任何解决scheme的问题。

我目前在Java的Datagramsockets有一些问题。 总的来说,问题是我有一段Java代码能够在Windows上接收数据包,而不是Linux。

我的申请至关重要

能够在Windows和Linux上工作。 可以说我们只支持Windows 7及更高版本。

适用于具有多个networking接口的机器。 通过这个我的意思是应该可以指定应用程序应该从哪个networking接口接收数据包。

我的testing机器

(如何)我可以减less套接字延迟吗?

如何在PF_UNIX套接字的服务器端打印客户端sun_paths名称

客户端套接字连接在Windows主机上被服务器拒绝对于小号(16 <x <24)的模拟客户端连接尝试

epoll在断开客户端时循环

通过networking桥接串行端口

m1:在物理机器上运行Windows 7 Pro x64。 java版本“1.8.0_45”(Oracle)

m2:在vmware中运行centos7 x64。 使用java版本“1.8.0_51”(Oracle)

m3:在物理机器上运行fedora 19 x64。 使用java版本1.7.0_71(openjdk)

m4:在vmware中运行fedora 19 x64。 java版本“1.8.0_31”

m5:在物理机器上运行windowsXP x86:这台机器没有运行我的程序,而是一个外部系统广播我想要接收的数据包。

m6:在物理机器上运行Windows 7 Pro x64:这台机器没有运行我的程序,而是一个外部系统广播我想要接收的数据包。

目前我的程序收到来自m1和m6的数据包,而不是m2,m3和m4。

总的来说,我的程序中套接字的逻辑可以描述如下

// Setting up the socket DatagramSocket socket = new DatagramSocket(networkInterfaceAddress,port); socket.setReceiveBufferSize(90000); // Setting up the receive packets DatagramPacket packet = new DatagramPacket(new byte[1],0); // Constructing the receive buffer buffer = new byte[1024] // Receiving the packet packet.setData(buffer); packet.setLength(buffer.length); socket.receive(packet);

我已经尝试了以下内容

禁用所有机器上的防火墙。 这没有帮助

在m2,m3和m4上使用Wireshark。 Wireshark能够检测到所有机器上的数据包,所以它们的确可以接收它们(4.也表示这个)

改变了我的testing设置,我从m2播出(使用我自己的应用程序,而不是外部系统)m1,m3或m4都不能接收数据包。 有趣的是我可以在m5和m6的外部系统中看到它们。

重写逻辑st我没有指定DatagramSocket的构造函数中的networkInterfaceAddress(所以我使用socket = new DatagramSocket(port);通过此更新,我突然能够接收m2,m3和m4的数据包

4似乎表明问题是networkInterfaceAddress,但如果我尝试在debugging模式下运行程序,我可以看到networkInterfaceAddress包含预期的值。 可以肯定的是,我也尝试了m2上的硬编码示例。 在这个虚拟的例子我

使用ifconfig查看我的networking接口的地址。 在我的情况下ifconfig给我初始化10.10.1.41

使用networkInterfaceAddress = InetAddress.getByName(“10.10.1.41”);

即使使用这个硬编码networking接口,我也无法接收数据包。

所以目前我只能通过不向DatagramSocket构造函数提供networking接口而在Linux上接收数据包。 这个解决scheme的问题是(就我所知),这将导致应用程序无法只接收来自特定networking接口的数据包。

说实话,我已经没有想法,所以我希望有人能够帮助我解决这个问题。

如何在非阻塞套接字上处理OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

nodejs无法在Windows上parsing“localhost”

从/ proc / net / sockstat获取networking连接

将围绕sockaddr_storage和sockaddr_in打破严格的别名

如何处理Linux套接字revellent POLLERR,POLLHUP和POLLNVAL?

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...