gpt4 book ai didi

java - 如何在多宿主系统(Java、Linux)上使用多播

转载 作者:搜寻专家 更新时间:2023-11-01 01:39:06 27 4
gpt4 key购买 nike

这是在 Java 中,但如果需要,我总是可以通过 JNI 恢复到 C。

我的系统有两个 NIC,每个都连接到不同的子网。我想使用多播(特别是 SDP)来发现两个网络上的其他主机。

一个网络很简单:在指定的端口上创建一个 MulticastSocket,加入它的组,然后我得到数据包。简单。

两个网络:到目前为止不可能。我试过:

1) 创建两个套接字,绑定(bind)到同一个端口并使用 setInterface() 或 setNetworkInterface() “连接”到正确的接口(interface)。没有运气,即使在 setReuseAddress() 的各种排列之后。

2) 创建一个套接字,然后尝试加入两次,两次调用 joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)。第二次加入调用失败。

Java 之外的解决方案会很棒。特别是,如果我可以设置多播路由来有效地“组合”两个接口(interface)(然后我可以查看每个数据包以确定哪个网络),那就没问题了。正如我之前提到的,在此环境(Linux,具有 Apache“luni”java 基础设施)中可以使用任何数量的 native 代码。

谢谢!

最佳答案

巧合的是,我最近正在处理类似的问题。

这里有一些 Java 代码可以执行您想要的操作——它在多个接口(interface)上获取 SDP 数据包。 joinGroup 用于“附加”到指定接口(interface)。

/**
* Demonstrate multi-homed multicast listening
*
* usage: java Multihome eth0 eth1 lo <etc>
*/

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;

public class Multihome {
// SDP constants
public static final String MULTICAST_ADDRESS = "239.255.255.250";
public static final int MULTICAST_PORT = 1900;

// args: each arg is the name of an interface.
public void doMain(Set<String> args)
throws Exception
{
InetSocketAddress socketAddress =
new InetSocketAddress(MULTICAST_ADDRESS, MULTICAST_PORT);
MulticastSocket socket = new MulticastSocket(MULTICAST_PORT);
Enumeration<NetworkInterface> ifs =
NetworkInterface.getNetworkInterfaces();

while (ifs.hasMoreElements()) {
NetworkInterface xface = ifs.nextElement();
Enumeration<InetAddress> addrs = xface.getInetAddresses();
String name = xface.getName();

while (addrs.hasMoreElements()) {
InetAddress addr = addrs.nextElement();

System.out.println(name + " ... has addr " + addr);
}

if (args.contains(name)) {
System.out.println("Adding " + name + " to our interface set");
socket.joinGroup(socketAddress, xface);
}
}

byte[] buffer = new byte[1500];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

while (true) {
try {
packet.setData(buffer, 0, buffer.length);
socket.receive(packet);
System.out.println("Received pkt from " + packet.getAddress() +
" of length " + packet.getLength());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

public static void main(String[] args)
throws Exception
{
Set<String> argSet = new HashSet<String>();
Multihome multi = new Multihome();

for (String arg : args) {
argSet.add(arg);
}

multi.doMain(argSet);
}
}

关于java - 如何在多宿主系统(Java、Linux)上使用多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com