【问题标题】:Java DatagramSocket listening on a broadcast addressJava DatagramSocket 监听广播地址
【发布时间】:2011-03-29 12:11:46
【问题描述】:

我已经编写了一个简单的测试类,旨在监听 Eth 并接收所有 UDP 数据包,这些数据包转到端口5001

public class Main {

  public static void main(String[] args) throws SocketException, UnknownHostException, IOException {
    DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("255.255.255.255"));
    socket.setBroadcast(true);
    System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast());
    byte[] buf = new byte[512];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    while (true) {
      System.out.println("Waiting for data");
      socket.receive(packet);
      System.out.println("Data received");
    }
  }
}

它不再起作用了。它打印出Waiting for data 并且永远不会继续。 tcpdump 告诉我,UDP 广播数据包来了。我究竟做错了什么?非常感谢。

【问题讨论】:

  • 您是否有机会在 c2x 领域工作?

标签: java broadcast


【解决方案1】:

接收方无法收听广播地址。

广播地址是给发送者的——发送者可以发送一个以 255.255.255.255:5001 为目的地的数据包,所有在子网中监听该端口的接收者都会收到它。但是没有办法创建一个可以接收“所有 UDP 数据包”的接收器。

如果你已经有一个广播发送者并且想要接收它的数据包,你需要监听一个通配符地址:

DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("0.0.0.0")); 

【讨论】:

  • 我不同意无法获取所有 UDP 流量。查找“Wireshark” - 它可以安静地监听您计算机上任何接口上的所有网络流量...而不会干扰流量.. 既然它存在并且可以工作,那么必须有 a 方法
  • 有一些方法,但不能不使用 Java API 之外的本机库。有关详细信息,请参阅我对 Jpcap 的回答。
【解决方案2】:

您发送的 DatagramSocket 套接字必须使用

绑定到端口 (5001)
socket = new DatagramSocket(5001);

那么当你在这个socket上发送时,使用

InetAddress sendAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf, buf.length, sendAddress, socket.getLocalPort());
socket.send(packet);  

然后当你在另一个套接字上监听时,使用

DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("127.0.0.1"));

您可以在端口 5001 上侦听您发送到端口 5001 的 UDP 数据。不知道为什么,这与 InetAddress 路由器表有关,它使用不同的 IP 地址子网获取相同的 127.0.0.1 地址?

【讨论】:

    【解决方案3】:

    您不能在纯 Java 中执行此操作,因为您需要将网络接口置于“混杂模式”,而 Java API 不包含任何执行此操作的方法。但是,有一些图书馆可以提供帮助。 Jpcap 看起来很有前途。 Techrepublic 写了一个简短的 intro 来说明如何使用它,虽然它看起来有点过时,因为它声称该库仅适用于 Windows 和 Linux,而 Jpcap 页面本身也提到了对 MacOS 的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多