我正在尝试订阅一个特定的市场数据提要,通过 FAST 协议(protocol)以多播方式分发。在Java中,有MulticastSocket
,也有DatagramChannel
支持多播。
我使用的 FAST 协议(protocol)库 OpenFAST 接受 MulticastSocket
实例来创建端点,但似乎无法在其配置中指定源 IP 地址,它绑定(bind)到“任何源”,这不适用于此市场数据提要。 可以(自 Java 1.7 起)创建一个定义了源 IP 的 DatagramChannel
,如下所述:
NetworkInterface interf = NetworkInterface.getByName("eth0");
InetAddress group = InetAddress.getByName("225.0.0.100");
InetAddress source = InetAddress.getByName("172.20.40.1");
DatagramChannel dc = DatagramChannel.open(ProtocolFamily.INET)
.setOption(SocketOption.SO_REUSEADDR, true)
.bind(new InetSocketAddress(5000))
.setOption(SocketOption.IP_MULTICAST_IF, interf);
MembershipKey key = dc.join(group, interf, source); // <- source specified
但是,我没有看到从 channel 获取 MulticastSocket
的方法,socket()
方法只返回普通的旧 DatagramSocket
.
有没有办法直接或从 DatagramChannel
创建启用源过滤的 MulticastSocket
?
最佳答案
java.nio.MulticastChannel
实现特定于源的多播,仅在 IGMPv3 中可用。 java.net.MulticastSocket
,另一方面,只支持 IGMPv2,所以你在这里运气不好。
我建议您在防火墙级别过滤掉不需要的多播源,但您也可以尝试 DatagramSocket.connect()
在应用程序中建立源过滤。
希望这对您有所帮助。
关于定义了数据报源的 Java MulticastSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16276361/