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

时间:2015-07-31 10:03:37

标签: java linux windows sockets datagram

请注意,在这个帖子中,海报似乎有一个与我相关的问题:DatagramSocket Broadcast Behavior (Windows vs. Linux)不幸的是,这篇文章在没有解决问题的情况下死亡。

我目前在Java中遇到一些Datagramsockets问题。总体而言,问题是我有一段Java代码能够在Windows上接收数据包而不是Linux。

我的申请非常重要

  • 能够在Windows和Linux上工作。可以说我们只支持Windows 7及更高版本。
  • 适用于具有多个网络接口的计算机。我的意思是,应该可以指定应用程序应从哪个网络接口接收数据包。

我的测试机器

  1. m1:在物理计算机上运行Windows 7 Pro x64。 java版本 " 1.8.0_45" (Oracle)的
  2. m2:在vmware中运行centos7 x64。用java 版本" 1.8.0_51" (Oracle)的
  3. m3:在a上运行fedora 19 x64 物理机器。使用java版本1.7.0_71(openjdk)
  4. m4:在vmware中运行fedora 19 x64。 java版本" 1.8.0_31"
  5. m5:在物理机上运行windowsXP x86:这台机器不是 运行我的程序,而是外部系统广播 我想收到的数据包。
  6. m6:在物理计算机上运行Windows 7 Pro x64:本机没有运行我的程序,而是外部系统广播我想要接收的数据包。
  7. 目前我的程序在m1上接收来自m5和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);
    

    我尝试了以下内容:

    1. 在所有计算机上禁用防火墙。这没有帮助
    2. 在m2,m3和m4上使用Wireshark。 Wireshark能够检测到所有机器上的数据包,因此确实收到了它们(4.也表明了这一点)
    3. 更改了我的测试设置s.t.我从m2广播(使用我自己的应用程序,而不是外部系统)m1,m3或m4都不能接收数据包。有趣的是,我能够在m5和m6的外部系统中看到它们。
    4. 重写逻辑s.t.我没有在DatagramSocket的构造函数中指定networkInterfaceAddress(所以我使用了socket = new DatagramSocket(port);。通过此更新,我突然能够接收m2,m3和m4上的数据包
    5. 4似乎表明问题是networkInterfaceAddress但是如果我尝试在调试模式下运行程序,我可以看到networkInterfaceAddress确实包含期望值。为了确保我在m2上尝试了一个hardcodet虚拟示例。在这个虚拟的例子中我

      1. 使用ifconfig查看我的网络接口的地址。在我的情况下,ifconfig给了我init 10.10.1.41
      2. used networkInterfaceAddress = InetAddress.getByName(" 10.10.1.41");
      3. 即使使用这种硬编码网络接口,我也无法接收数据包。

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

        说实话,我的想法已经不多了,所以我希望有人可以帮我解决这个问题。

0 个答案:

没有答案