【发布时间】: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。