gpt4 book ai didi

linux - 在 SuSe Linux 和 JDK7 上,加入多个组不适用于 Netty 3.6.5.Final

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:50 25 4
gpt4 key购买 nike

我正在 Suse Linux 上使用 Netty 3.6.5.Final 和 JDK7 (Nio.2) 实现 UDP 服务器,但我遇到了困难。该问题具体涉及 Windows 和 MacOS 与 Linux 上绑定(bind)到通配符地址 (0.0.0.0) 的差异。

我有一个用于发送数据的多播组和一个用于接收数据的组,两者都绑定(bind)到同一端口。当我尝试在出站组上发布时,我在入站组上收到数据包,这很糟糕。在 windows/mac 上这不是问题。一个 Linux 就会出现“混杂”的行为。

在 Linux 上,绑定(bind)通配符地址会导致绑定(bind)端口上的所有 UDP 流量都被传递,而不管组成员身份如何(因此是上面的示例)。对于 MacOS/Windows,您只能从通过 joinGroup() 订阅的群组获取流量。后者是期望的行为。

Linux 的准解决方案是绑定(bind)到您有兴趣接收流量的多播组地址。这对于您加入的第一个群组(恰好是您绑定(bind)的群组地址)非常有用。但是,如果您想使用同一订阅者通过 joinGroup() 加入其他群组,则不会传递额外的群组流量。

我还尝试绑定(bind)到默认 NIC 的 IP 地址,但根本没有传输任何流量。

所以我尝试过:

if(SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_WINDOWS) {
socketAddress = new InetSocketAddress(port);
} else {
socketAddress = new InetSocketAddress(getUnixBindAddress(), port);
}
groupChannel = (DatagramChannel)bootstrap.bind(socketAddress);

其中 getUnixBindAddress() 获取默认的 NIC IP 地址。在这种情况下不会传输任何流量。

我也尝试过:

if(SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_WINDOWS) {
socketAddress = new InetSocketAddress(port);
} else {
socketAddress = new InetSocketAddress(multicastAddress, port);
}
groupChannel = (DatagramChannel)bootstrap.bind(socketAddress);

其中multicastAddress是要加入的第一个组的地址。仅传送来自第一个加入组的流量。

我的 joinGroup() 调用如下所示:

ChannelFuture future = groupChannel.joinGroup(new InetSocketAddress(group.getGroupAddress(), group.getPort()), networkInterface);
future.syncUninterruptibly();

引导代码如下:

bootstrap = new ConnectionlessBootstrap(new NioDatagramChannelFactory(
Executors.newSingleThreadExecutor(), InternetProtocolFamily.IPv4));
bootstrap.setOption("broadcast", false);
bootstrap.setOption("loopbackModeDisabled", true);
bootstrap.setOption("reuseAddress", true);
bootstrap.setPipelineFactory(this);

如果有人对如何在 Linux 上的 Netty 上进行多个组订阅有任何见解,我将不胜感激。

-布莱恩

最佳答案

事实证明,在 Linux 上,默认行为是多路复用流量,这样当绑定(bind)到 0.0.0.0 时,该端口上的所有组都会收到所有多播流量。

由于默认行为,应用程序必须过滤掉不需要的组的流量。出于安全原因,这是必要的,可以确保应用程序仅接收预期的流量。

还有一个名为 IP_MULTICAST_ALL 的套接字选项,显然可以设置(这在 Java 中不是标准的,所以我不确定如何设置),这将强制堆栈实现所需的非标准行为。

关于linux - 在 SuSe Linux 和 JDK7 上,加入多个组不适用于 Netty 3.6.5.Final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430765/

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