【问题标题】:Java Multicast receiver not workingJava多播接收器不工作
【发布时间】:2021-06-04 09:38:17
【问题描述】:

我想从一个组播组和端口捕获数据包。首先,我使用 tcpdump 命令检查数据是否被捕获。

命令 -

tcpdump -i <interface name> dst <multicast ip>

我在java中创建了一个程序,它将加入这个多播组并在控制台上打印数据。

接收器 -

public class MulticastClient {

    public static void main(String args[]) throws IOException {
        MulticastSocket socket = new MulticastSocket(<port number here>);
        //socket.setInterface(InetAddress.getByName("<local interface ip address>")); // This line makes sense or not...don't know
        socket.joinGroup(InetAddress.getByName("<multicast ip here>"));

        while (true) {
            byte ab[] = new byte[583];
            DatagramPacket packet = new DatagramPacket(ab, ab.length);
            socket.receive(packet);
            System.out.println("Got packet " + Arrays.toString(ab));
        }
    }
}

此程序无法捕获来自给定多播组和端口的数据包。

为了测试,我创建了一个 MulticastSockerServer,它将在一个多播组和端口上发送数据。

发件人 -

public class MulticastServer {

    public static void main(String[] args) throws Exception {

        final InetAddress group = InetAddress.getByName("<multicast group ip>");
        final int port = <port number>;

        try {
            MulticastSocket socket = new MulticastSocket(9000);
            //socket.setInterface(InetAddress.getByName("<local interface ip address>"));
            socket.joinGroup(group);

            byte[] bt = new byte[100];
            byte index = 0;
            while (true) {
                Arrays.fill(bt, (byte) index++);
                socket.send(new DatagramPacket(bt, 100, group, port));
                System.out.println("sent 100 bytes");
                Thread.sleep(1 * 1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果我运行这两个程序,那么它将按预期工作,数据会在接收器端捕获。那为什么只有接收者不能从不同的组播组ip和端口捕获数据呢?

任何建议都会被采纳。

【问题讨论】:

  • 只是为了确定:那个 tcpdump 调用——基本上你在那个系统上做了一个实验,你正在运行 java 代码以确保你可以真正连接到多播服务器?例如防止被防火墙阻止?
  • @GhostCat- 我已经检查了防火墙状态,它目前没有运行。我的 java 发送器和接收器工作正常,但仍然无法从服务器多播组 ip 和端口捕获数据
  • 您的 Java 客户端仅显示 UDP 多播数据报,但您的 tcpdump 命令显示任何类型的多播数据报,而不仅仅是 UDP 数据报 => 您确定本地网络上有 UDP 多播数据报吗?另一个问题:你的主机上有多个接口吗?
  • 顺便说一句,发件人不需要使用MulticastSocket 或加入群组。只有接收器可以。发件人可以使用DatagramSocket。

标签: java multicast


【解决方案1】:

我明白了,我发现为什么 java 客户端没有获取数据。实际上 tcpdump 命令是 -

tcpdump -i <interface name> dst <multicast ip>

此命令将捕获具有由命令(多播 ip)给出的目标地址的任何数据包(即无论是 UDP 还是 PGM)。

Java 客户端只会捕获 UDP 数据包而不是 PGM 数据包。在我的本地网络上,只有 PGM 数据包可用,因此 tcpdump 命令将为我们提供数据,但 Java 客户端不会收到任何数据。

如果您想捕获 PGM 数据包,则需要使用以下方法之一 -

  1. 使用 JnetPcap 库来捕获/读取任何(即 UDP 或 PGM)数据包。
  2. 使用 Javapgm 库仅捕获 pgm 数据包。
  3. 使用 dumpcap 捕获数据包并将其存储在 pcap 文件中。

希望对你有帮助。

【讨论】:

  • 注意:PGM 自 2001 年以来一直是“实验性的”,仍然不是 IETF 标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2012-11-14
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多