From 0db4d85147b9668e578e2434872f38fc21946242 Mon Sep 17 00:00:00 2001 From: Mikayla Hutchinson Date: Wed, 19 Apr 2017 05:48:41 -0400 Subject: [PATCH] Fix RemoteEndpoint with async+DualMode (#4717) --- mcs/class/System/System.Net.Sockets/Socket.cs | 11 +++++------ .../System/Test/System.Net.Sockets/SocketTest.cs | 10 ++++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/mcs/class/System/System.Net.Sockets/Socket.cs b/mcs/class/System/System.Net.Sockets/Socket.cs index 4d5d7b41849..89911c426b4 100644 --- a/mcs/class/System/System.Net.Sockets/Socket.cs +++ b/mcs/class/System/System.Net.Sockets/Socket.cs @@ -901,12 +901,11 @@ namespace System.Net.Sockets SocketAsyncResult ares; if (!GetCheckedIPs (e, out addresses)) { - e.socket_async_result.EndPoint = e.RemoteEndPoint; + //NOTE: DualMode may cause Socket's RemoteEndpoint to differ in AddressFamily from the + // SocketAsyncEventArgs, but the SocketAsyncEventArgs itself is not changed ares = (SocketAsyncResult) BeginConnect (e.RemoteEndPoint, ConnectAsyncCallback, e); } else { - DnsEndPoint dep = (e.RemoteEndPoint as DnsEndPoint); - e.socket_async_result.Addresses = addresses; - e.socket_async_result.Port = dep.Port; + DnsEndPoint dep = (DnsEndPoint)e.RemoteEndPoint; ares = (SocketAsyncResult) BeginConnect (addresses, dep.Port, ConnectAsyncCallback, e); } @@ -984,8 +983,8 @@ namespace System.Net.Sockets sockares.Complete (new SocketException ((int) SocketError.AddressNotAvailable), true); return sockares; } - - remoteEP = RemapIPEndPoint (ep); + + sockares.EndPoint = remoteEP = RemapIPEndPoint (ep); } int error = 0; diff --git a/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs b/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs index 6e82f9d6db8..6e80da7dc78 100755 --- a/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs +++ b/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs @@ -4620,6 +4620,8 @@ namespace MonoTests.System.Net.Sockets client.DualMode = true; var ar1 = client.BeginConnect (ep, BCCallback, client); Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1"); + Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#2"); + Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#3"); client.Disconnect (false); client.Close (); @@ -4627,7 +4629,9 @@ namespace MonoTests.System.Net.Sockets client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); client.DualMode = true; var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client); - Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2"); + Assert.IsTrue (BCCalledBack.WaitOne (10000), "#4"); + Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#5"); + Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#6"); client.Disconnect (false); client.Close (); @@ -4635,7 +4639,9 @@ namespace MonoTests.System.Net.Sockets client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); client.DualMode = true; var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client); - Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2"); + Assert.IsTrue (BCCalledBack.WaitOne (10000), "#7"); + Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#8"); + Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#9"); client.Disconnect (false); client.Close(); } -- 2.25.1