Netty UDP广播接收器可以在一个NIC上工作但不能在另一个NIC上工作 - 为什么

时间:2017-04-12 12:23:18

标签: java linux udp netty broadcast

嗨 - 我想知道是否有人可以帮助我。我正在使用Netty 4.1.9在两台Linux机器之间发送UDP消息:

  • 两台计算机通过3个独立的NIC连接到相同的3个网络。
  • 我有一些工作代码可以将消息从一个发送到另一个并且收到的正常。
  • 然后我更改了代码,强制UDP流量进入另一个网络,通过发送方上的不同网卡。
  • 发送工作,我可以看到不同网络上的流量,但现在netty接收器无法看到流量。

据我所知,接收器代码不应该关心数据所在的NIC,所以我不明白这是什么问题。

我确定数据到达正确NIC上的接收器主机,因为在接收器上运行“ tshark -i ”会显示正确网络上的流量,并显示正确的目标端口,以及预期长度。

我在两种情况下使用的广播地址是255.255.255.255。

以下是设置接收器通道的代码,此代码在流量到达第一个NIC时工作正常,但在到达另一个NIC时则无效:

public Channel createReceivingChannel(final int port,
                                      final EventLoopGroup myGroup) throws InterruptedException
{
   return new Bootstrap()
            .group(myGroup)
            .channelFactory(new ChannelFactory<NioDatagramChannel>()
            {
                @Override
                public NioDatagramChannel newChannel()
                {
                    return new NioDatagramChannel(InternetProtocolFamily.IPv4);
                }
            })
            .handler(new ReceiverInitializer(this.protocolConfig))

            .bind(port).sync().channel();
}

这是与接收器一起使用的发送器代码,但是将UDP消息放在错误的网络上:

public Channel createSendingChannel(      final NetworkAddress localAddress,
                                          final int port,
                                          final EventLoopGroup myGroup) throws InterruptedException
{
    return new Bootstrap()
            .group(myGroup)
            .channelFactory(new ChannelFactory<NioDatagramChannel>()
            {
                @Override
                public NioDatagramChannel newChannel()
                {
                    return new NioDatagramChannel(InternetProtocolFamily.IPv4);
                }
            })
            .localAddress(localAddress.address, port)
            .option(ChannelOption.SO_BROADCAST, true)
            .handler(new SenderInitializer(this.protocolConfig))

            .bind(0).sync().channel();
}

这是我的发送者代码,它将数据放在正确的网络上,但上面的接收者看不到它:

public Channel createSendingChannel(
                                    final NetworkAddress localAddress,
                                    final int port,

                                    final EventLoopGroup myGroup) throws InterruptedException
{
   final InetSocketAddress localSocketAddress = new InetSocketAddress(localAddress.address, port);

    return new Bootstrap()
            .group(myGroup)
            .channelFactory(new ChannelFactory<NioDatagramChannel>()
            {
                @Override
                public NioDatagramChannel newChannel()
                {
                    return new NioDatagramChannel(InternetProtocolFamily.IPv4);
                }
            })
            .localAddress(localAddress.address, port)
            .option(ChannelOption.SO_BROADCAST, true)
            .handler(new SenderInitializer(this.protocolConfig))

            .bind(localSocketAddress).sync().channel(); // difference here to bind the sender to correct NIC
}

在此阶段感激不尽的任何帮助。我被卡住了。

非常感谢,

迈克尔。

0 个答案:

没有答案