问题描述
我可以使用以下代码将单播和多播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 (将#修改为@)