diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java index 4aea9cf37a..c41f44dd34 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java @@ -19,6 +19,7 @@ import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import org.junit.Test; @@ -65,7 +66,7 @@ public class DatagramUnicastTest extends AbstractDatagramTest { @Test public void testSimpleSendWithoutBind() throws Throwable { - //run(); + run(); } public void testSimpleSendWithoutBind(Bootstrap sb, Bootstrap cb) throws Throwable { @@ -85,6 +86,7 @@ public class DatagramUnicastTest extends AbstractDatagramTest { // Nothing will be sent. } }); + cb.option(ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION, true); Channel sc = sb.bind().sync().channel(); Channel cc = cb.register().sync().channel(); diff --git a/transport/src/main/java/io/netty/channel/ChannelOption.java b/transport/src/main/java/io/netty/channel/ChannelOption.java index 0548570494..2c03431055 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOption.java +++ b/transport/src/main/java/io/netty/channel/ChannelOption.java @@ -89,6 +89,9 @@ public class ChannelOption extends UniqueName { public static final ChannelOption TCP_NODELAY = new ChannelOption("TCP_NODELAY"); + @Deprecated + public static final ChannelOption DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION = + new ChannelOption("DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION"); /** * Create a new {@link ChannelOption} with the given name. The name needs to be * unique. diff --git a/transport/src/main/java/io/netty/channel/socket/DefaultDatagramChannelConfig.java b/transport/src/main/java/io/netty/channel/socket/DefaultDatagramChannelConfig.java index 728ce1382f..269446159f 100644 --- a/transport/src/main/java/io/netty/channel/socket/DefaultDatagramChannelConfig.java +++ b/transport/src/main/java/io/netty/channel/socket/DefaultDatagramChannelConfig.java @@ -46,6 +46,7 @@ public class DefaultDatagramChannelConfig extends DefaultChannelConfig implement private static final RecvByteBufAllocator DEFAULT_RCVBUF_ALLOCATOR = new FixedRecvByteBufAllocator(2048); private final DatagramSocket javaSocket; + private volatile boolean activeOnOpen; /** * Creates a new instance. @@ -64,7 +65,7 @@ public class DefaultDatagramChannelConfig extends DefaultChannelConfig implement return getOptions( super.getOptions(), SO_BROADCAST, SO_RCVBUF, SO_SNDBUF, SO_REUSEADDR, IP_MULTICAST_LOOP_DISABLED, - IP_MULTICAST_ADDR, IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_TOS); + IP_MULTICAST_ADDR, IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_TOS, DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION); } @SuppressWarnings("unchecked") @@ -99,7 +100,9 @@ public class DefaultDatagramChannelConfig extends DefaultChannelConfig implement if (option == IP_TOS) { return (T) Integer.valueOf(getTrafficClass()); } - + if (option == DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) { + return (T) Boolean.valueOf(activeOnOpen); + } return super.getOption(option); } @@ -125,6 +128,8 @@ public class DefaultDatagramChannelConfig extends DefaultChannelConfig implement setTimeToLive((Integer) value); } else if (option == IP_TOS) { setTrafficClass((Integer) value); + } else if (option == DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) { + setActiveOnOpen((Boolean) value); } else { return super.setOption(option, value); } @@ -132,6 +137,12 @@ public class DefaultDatagramChannelConfig extends DefaultChannelConfig implement return true; } + private void setActiveOnOpen(boolean activeOnOpen) { + if (channel.isRegistered()) { + throw new IllegalStateException("Can only changed before channel was registered"); + } + this.activeOnOpen = activeOnOpen; + } @Override public boolean isBroadcast() { try { diff --git a/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannel.java b/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannel.java index 305fea7351..c95801c2ec 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannel.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannel.java @@ -23,6 +23,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelException; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelMetadata; +import io.netty.channel.ChannelOption; import io.netty.channel.ChannelOutboundBuffer; import io.netty.channel.ChannelPromise; import io.netty.channel.DefaultAddressedEnvelope; @@ -128,7 +129,9 @@ public final class NioDatagramChannel @Override public boolean isActive() { DatagramChannel ch = javaChannel(); - return ch.isOpen(); + return ch.isOpen() && ( + (config.getOption(ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) && isRegistered()) + || ch.socket().isBound()); } @Override diff --git a/transport/src/main/java/io/netty/channel/socket/oio/OioDatagramChannel.java b/transport/src/main/java/io/netty/channel/socket/oio/OioDatagramChannel.java index 1c9d3ec3bc..a47010749c 100644 --- a/transport/src/main/java/io/netty/channel/socket/oio/OioDatagramChannel.java +++ b/transport/src/main/java/io/netty/channel/socket/oio/OioDatagramChannel.java @@ -22,6 +22,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelException; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelMetadata; +import io.netty.channel.ChannelOption; import io.netty.channel.ChannelOutboundBuffer; import io.netty.channel.ChannelPromise; import io.netty.channel.RecvByteBufAllocator; @@ -125,7 +126,8 @@ public class OioDatagramChannel extends AbstractOioMessageChannel @Override public boolean isActive() { - return isOpen() && socket.isBound(); + return isOpen() && (config.getOption(ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) && isRegistered()) + || socket.isBound(); } @Override