我想从一个多播组和端口捕获数据包。首先,我使用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和端口捕获数据?
任何建议都将被挪用。
答案 0 :(得分:1)
我清楚了,我发现为什么java客户端没有获取数据。实际上tcpdump命令是 -
tcpdump -i <interface name> dst <multicast ip>
此命令将捕获目标地址由命令(多播ip)给出的任何数据包(即无论是UDP还是PGM)。
Java客户端仅捕获UDP数据包而不捕获PGM数据包。在我的本地网络上,只有PGM数据包可用,因此tcpdump命令将为我们提供数据,但Java客户端将不会接收任何数据。
如果你想捕获PGM数据包,那么你需要使用下面的一个 -
希望它有所帮助。