在Netty 4的同一套接字上发送/接收单播和接收多播

问题描述

我可以使用以下代码将单播和多播udp接收到同一网卡和端口上

Bootstrap clientBootstrap = new Bootstrap();
clientBootstrap.group(group)
        .channel(NioDatagramChannel.class)
        .option(ChannelOption.so_REUSEADDR,true)
        .option(ChannelOption.so_RCVBUF,rcvbuf)
        .option(ChannelOption.IP_MULTICAST_IF,localNIC)
        .handler(new ChannelInitializer<NioDatagramChannel>() {

            public void initChannel(NioDatagramChannel ch) {
                ch.pipeline().addLast(handler);
                ChannelFuture channelFuture = ch.joinGroup(multicastAddress,localNIC,null);
                try {
                    channelFuture.sync();
                } catch (InterruptedException e) {
                    log.error("error syncing on channelFuture",e);
                }
            }
        });
try {
    clientBootstrap.bind(receivePort).sync();
} catch (InterruptedException e) {
    log.error("error binding",e);
}

因此,目前,我(10.70.40.2)能够使用上述代码接收以下消息

UDP multicast 10.66.0.104.52221 > 232.66.1.2.11002
UDP unicast 10.66.0.95.11003 > 10.70.40.2.11002

但是我还需要向另一个方向发送单播:

UDP unicast 10.70.40.2.11002 > 10.66.0.95.11003

(实际上,接收到的单播数据包应该是对我首先发送单播请求的响应。到目前为止,我刚刚使用tcpreplay伪造了该响应,以检查单个套接字上的单播+多播接收是否为实际上,假设端口相同,就可以用Netty)

如果我使用单独的(非Netty)DatagramSocket发送,则必须绑定它(因为我必须从端口11002发送,因为另一端将响应回源端口)。但是,如果我将其绑定,则此套接字将从Netty接收套接字中抢走udp“响应”。

但是我似乎无法在引导程序上进行配置,以便可以

  • 在11002上接收多播
  • 在11002上接收单播
  • 从11002发送单播

我只能同时获得三个中的两个。当尝试使用单独的套接字发送时,这是我的DatagramSocket代码

DatagramSocket socket = new DatagramSocket(null);
socket.setoption(StandardSocketoptions.so_REUSEADDR,true);
socket.bind(localAddress);
final DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,remoteAddress);
socket.send(datagramPacket);

有什么想法吗?

我已经验证了可以从发送方DatagramSocket接收数据包,然后将其转发到Netty处理程序,但是这种方式不太优雅,我仍然希望有一个单一的Netty通道解决方案。


当我在clientBootstrap.bind()以上替换为

clientBootstrap.connect(
    new InetSocketAddress(unicastHost,unicastPort),new InetSocketAddress("0.0.0.0",receivePort)).sync();

不会有单播或多播接收。

当改为这样做时

clientBootstrap.connect(
    new InetSocketAddress(unicastHost,new InetSocketAddress(localNIC,receivePort)).sync();

我至少能够接收单播流量,但不能接收多播。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...