diff --git a/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java b/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java index 9bd8f38b38..aca8b607be 100644 --- a/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java +++ b/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java @@ -298,9 +298,14 @@ public class DatagramUnicastTest extends AbstractDatagramTest { } assertTrue(cc.isConnected()); + assertNotNull(cc.localAddress()); + assertNotNull(cc.remoteAddress()); + // Test what happens when we call disconnect() cc.disconnect().syncUninterruptibly(); assertFalse(cc.isConnected()); + assertNotNull(cc.localAddress()); + assertNull(cc.remoteAddress()); ChannelFuture future = cc.writeAndFlush( buf.retain().duplicate()).awaitUninterruptibly(); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java index 652f647ed8..0c8a60b625 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java @@ -200,6 +200,11 @@ abstract class AbstractEpollChannel extends AbstractChannel implements UnixChann } } + void resetCachedAddresses() { + local = socket.localAddress(); + remote = socket.remoteAddress(); + } + @Override protected void doDisconnect() throws Exception { doClose(); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java index 721f55bd92..26090d0809 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java @@ -439,6 +439,7 @@ public final class EpollDatagramChannel extends AbstractEpollChannel implements protected void doDisconnect() throws Exception { socket.disconnect(); connected = active = false; + resetCachedAddresses(); } @Override diff --git a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java index 4efe48f1b2..a0a4ea75e1 100644 --- a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java +++ b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java @@ -138,6 +138,11 @@ abstract class AbstractKQueueChannel extends AbstractChannel implements UnixChan doClose(); } + void resetCachedAddresses() { + local = socket.localAddress(); + remote = socket.remoteAddress(); + } + @Override public boolean isOpen() { return socket.isOpen(); diff --git a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java index b59e5fa946..c2473fd856 100644 --- a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java +++ b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java @@ -371,6 +371,7 @@ public final class KQueueDatagramChannel extends AbstractKQueueChannel implement protected void doDisconnect() throws Exception { socket.disconnect(); connected = active = false; + resetCachedAddresses(); } @Override diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index 536ca7d9e3..5c2429ff0d 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -566,6 +566,9 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha boolean wasActive = isActive(); try { doDisconnect(); + // Reset remoteAddress and localAddress + remoteAddress = null; + localAddress = null; } catch (Throwable t) { safeSetFailure(promise, t); closeIfClosed();