定义了数据报源的 Java MulticastSocket

标签 java sockets networking nio multicast

我正在尝试订阅一个特定的市场数据提要,通过 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/

相关文章:

java - 如何同时在单个端口上运行 tcp 和 udp?

c# - UWP(通用 Windows 平台)上的套接字通信

java - 连接到服务器,发送字符串并接收对象 - BufferedReader 不是 'ready' ?

ios - 任何简单的工具都可以帮助我测试 IP session ?

java - 如何将以下 C++ 语句转换为 Java?

java - 对于大型 ByteBuffer,单独 SocketChannel 的并发 read() 速度较慢

java - 使用继承时如何摆脱 instanceof 检查?

c++ - 我在这个套接字中错过了什么? (Windows 套接字)

java - 如何促进Java中服务器线程和多个客户端线程之间的通信

go - 在互联网接口(interface)上监听时有没有办法丢弃数据包?