请注意,在这个线程海报似乎有一个与我的问题: 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?