在广播地址上侦听的Java DatagramSocket

在广播地址上侦听的Java DatagramSocket,java,broadcast,Java,Broadcast,我已经编写了一个简单的测试类,用于侦听Eth并接收所有的UDP数据包,这些数据包将发送到端口5001: public class Main { public static void main(String[] args) throws SocketException, UnknownHostException, IOException { DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("

我已经编写了一个简单的测试类,用于侦听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");
    }
  }
}

它不再工作了。它在等待数据时打印出
,并且从不继续。tcpdump告诉我,UDP广播数据包来了。我做错了什么?非常感谢。

接收器无法收听广播地址

广播地址用于发送方-发送方可以发送一个以255.255.255.255:5001作为目的地的数据包,并且在子网中侦听该端口的所有接收方都将接收该数据包。但是没有办法创建一个可以接收“所有UDP数据包”的接收器

如果您已经有一个广播发送方并希望接收其数据包,则需要改为侦听通配符地址:

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

必须使用将发送的DatagramSocket套接字绑定到端口(5001)

然后,当您使用此套接字发送时,请使用

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的UDP数据,即端口5001。不知道为什么,这与InetAddress路由器表有关,它为同一127.0.0.1地址使用不同的IP地址子网?

在纯Java中无法做到这一点,因为您需要将网络接口置于“混杂模式”,而Java API不包含任何实现这一点的方法。但是,有些库可以提供帮助。看起来很有前途。Techrepublic写了一篇关于如何使用它的短文,尽管它看起来有点过时,因为它声称该库只适用于Windows和Linux,而Jpcap页面本身也提到了对MacOS的支持。

您是否有机会在c2x领域工作?我不同意无法获得所有UDP流量的说法。查找“Wireshark”-它可以安静地监听计算机上任何接口上的所有网络流量。。。在不影响交通的情况下。。由于它的存在和工作,必须有一种方法有多种方法,但不能不使用JavaAPI之外的本机库。有关详细信息,请参阅我关于Jpcap的回答。
DatagramSocket socket = new DatagramSocket(5001, InetAddress.getByName("127.0.0.1"));