Merge pull request #2274 from esdrubal/udpclientreceive
authorMarcos Henrich <marcoshenrich@gmail.com>
Wed, 13 Jan 2016 10:17:38 +0000 (10:17 +0000)
committerMarcos Henrich <marcoshenrich@gmail.com>
Wed, 13 Jan 2016 10:17:38 +0000 (10:17 +0000)
Fixes UdpClient.Receive with IPv6 endpoint

1  2 
mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs

index 334f552b515a94da5491f6c3a74280c83a34771c,959a8c4d9a1e8e3cff0c4a1f04fd2ce704d58310..f1916f261513f3fd9cc98a0f443da94fa48466b8
@@@ -9,7 -9,6 +9,7 @@@ using System
  using System.Net;
  using System.Net.Sockets;
  using System.Threading;
 +using System.Threading.Tasks;
  
  using NUnit.Framework;
  
@@@ -831,37 -830,31 +831,37 @@@ namespace MonoTests.System.Net.Sockets 
                {
                        UdpClient client = null;
                        var rnd = new Random ();
 -                      for (int i = 0; i < 5; i++) {
 +                      for (int i = 0, max = 5; i < max; i++) {
                                int port = rnd.Next (1025, 65534);
                                try {
                                        client = new UdpClient (port);
                                        break;
                                } catch (Exception) {
 -                                      if (i == 5)
 +                                      if (i == max - 1)
                                                throw;
                                }
                        }
  
 -                      new Thread(delegate() {
 -                              Thread.Sleep(2000);
 -                              client.Close();
 -                              }).Start();
 -
 +                      ManualResetEvent ready = new ManualResetEvent (false);
                        bool got_exc = false;
 -                      IPEndPoint ep = new IPEndPoint (IPAddress.Any, 0);
 -                      try {
 -                              client.Receive(ref ep);
 -                      } catch (SocketException) {
 -                              got_exc = true;
 -                      } finally {
 -                              client.Close ();
 -                      }
 +
 +                      Task receive_task = Task.Factory.StartNew (() => {
 +                              IPEndPoint ep = new IPEndPoint (IPAddress.Any, 0);
 +                              try {
 +                                      ready.Set ();
 +                                      client.Receive(ref ep);
 +                              } catch (SocketException) {
 +                                      got_exc = true;
 +                              } finally {
 +                                      client.Close ();
 +                              }
 +                      });
 +
 +                      ready.WaitOne (2000);
 +                      Thread.Sleep (20);
 +                      client.Close();
 +
 +                      Assert.IsTrue (receive_task.Wait (1000));
                        Assert.IsTrue (got_exc);
                }
  
  
                        client.Close ();
                }
+               [Test] // #6057
+               public void ReceiveIPv6 ()
+               {
+                       int PORT = 9997;
+                       using(var udpClient = new UdpClient (PORT, AddressFamily.InterNetworkV6))
+                       using(var udpClient2 = new UdpClient (PORT+1, AddressFamily.InterNetworkV6))
+                       {
+                               var dataSent = new byte [] {1,2,3};
+                               udpClient2.SendAsync (dataSent, dataSent.Length, "::1", PORT);
+                               IPEndPoint endPoint = new IPEndPoint (IPAddress.IPv6Any, 0);
+                               var data = udpClient.Receive (ref endPoint);
+                               Assert.AreEqual (dataSent.Length, data.Length);
+                       }
+               }
                
                /* No test for Ttl default as it is platform dependent */