[System*] Add category for tests that use API that require BSD sockets.
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketTest.cs
index a0e19d4f2d15d6d856fcf37ff33c86c1173274d5..9551c1e6027131d4217bd59a13d986438873d5e2 100755 (executable)
@@ -15,6 +15,7 @@ using System.Collections;
 using System.Threading;
 using System.Reflection;
 using System.Text.RegularExpressions;
+using System.Threading.Tasks;
 using System.Net;
 using System.Net.Sockets;
 using NUnit.Framework;
@@ -22,9 +23,12 @@ using System.IO;
 
 using System.Collections.Generic;
 
+using MonoTests.Helpers;
+
 namespace MonoTests.System.Net.Sockets
 {
        [TestFixture]
+       [Category ("RequiresBSDSockets")]
        public class SocketTest
        {
                // note: also used in SocketCas tests
@@ -34,7 +38,7 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void ConnectIPAddressAny ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Any, 0);
+                       IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
 
                        /* UDP sockets use Any to disconnect
                        try {
@@ -64,7 +68,7 @@ namespace MonoTests.System.Net.Sockets
                public void IncompatibleAddress ()
                {
                        IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any,
-                                                               0);
+                                                               NetworkHelpers.FindFreePort ());
 
                        try {
                                using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) {
@@ -111,9 +115,9 @@ namespace MonoTests.System.Net.Sockets
                        Socket.Select (list, list, list, 1000);
                }
                
-               private bool BlockingConnect (bool block)
+               private bool BlockingConnect (bool block, int port)
                {
-                       IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 1234);
+                       IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, port);
                        Socket server = new Socket(AddressFamily.InterNetwork,
                                                   SocketType.Stream,
                                                   ProtocolType.Tcp);
@@ -155,11 +159,12 @@ namespace MonoTests.System.Net.Sockets
                public void AcceptBlockingStatus()
                {
                        bool block;
-
-                       block = BlockingConnect(true);
+                       var port = NetworkHelpers.FindFreePort ();
+       
+                       block = BlockingConnect(true, port);
                        Assert.AreEqual (block, true, "BlockingStatus01");
 
-                       block = BlockingConnect(false);
+                       block = BlockingConnect(false, port);
                        Assert.AreEqual (block, false, "BlockingStatus02");
                }
 
@@ -208,7 +213,7 @@ namespace MonoTests.System.Net.Sockets
                         * anything...
                         */
                        sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
-                                                          114),
+                                                          NetworkHelpers.FindFreePort ()),
                                           new AsyncCallback (CFACallback),
                                           sock);
                        CFACalledBack.WaitOne ();
@@ -219,7 +224,7 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void SetSocketOptionBoolean ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 1);
+                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        Socket sock = new Socket (ep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        try {
                                sock.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
@@ -230,7 +235,7 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void TestSelect1 ()
                {
-                       Socket srv = CreateServer ();
+                       Socket srv = CreateServer (NetworkHelpers.FindFreePort ());
                        ClientSocket clnt = new ClientSocket (srv.LocalEndPoint);
                        Thread th = new Thread (new ThreadStart (clnt.ConnectSleepClose));
                        Socket acc = null;
@@ -260,10 +265,10 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
 
-               static Socket CreateServer ()
+               static Socket CreateServer (int port)
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                       sock.Bind (new IPEndPoint (IPAddress.Loopback, 0));
+                       sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
                        sock.Listen (1);
                        return sock;
                }
@@ -369,7 +374,7 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed19 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
+                       EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
                        s.Close();
 
                        s.SendTo (buf, 0, ep);
@@ -380,7 +385,7 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed20 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
+                       EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
                        s.Close();
 
                        s.SendTo (buf, 10, 0, ep);
@@ -391,7 +396,7 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed21 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
+                       EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
                        s.Close();
 
                        s.SendTo (buf, 0, 10, 0, ep);
@@ -402,7 +407,7 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed22 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
+                       EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
                        s.Close();
 
                        s.SendTo (buf, ep);
@@ -424,7 +429,7 @@ namespace MonoTests.System.Net.Sockets
                        Socket server = new Socket (AddressFamily.InterNetwork,
                                SocketType.Stream, ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       9010);
+                                                       NetworkHelpers.FindFreePort ());
                        server.Bind (ep);
                        server.Listen (1);
 
@@ -570,8 +575,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.DontFragment = true;
                                Assert.Fail ("DontFragment #1");
                        } catch (NotSupportedException) {
-                       } catch {
-                               Assert.Fail ("DontFragment #2");
                        } finally {
                                sock.Close ();
                        }
@@ -589,8 +592,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("EnableBroadcastDefaultTcp #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
-                       } catch {
-                               Assert.Fail ("EnableBroadcastDefaultTcp #2");
                        } finally {
                                sock.Close ();
                        }
@@ -620,8 +621,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("EnableBroadcastChangeTcp #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
-                       } catch {
-                               Assert.Fail ("EnableBroadcastChangeTcp #2");
                        } finally {
                                sock.Close ();
                        }
@@ -682,7 +681,7 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        
-                       sock.Bind (new IPEndPoint (IPAddress.Any, 1235));
+                       sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                        sock.ExclusiveAddressUse = true;
                        sock.Close ();
                }
@@ -790,8 +789,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("MulticastLoopbackDefaultTcp #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
-                       } catch {
-                               Assert.Fail ("MulticastLoopbackDefaultTcp #2");
                        } finally {
                                sock.Close ();
                        }
@@ -809,8 +806,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("MulticastLoopbackChangeTcp #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
-                       } catch {
-                               Assert.Fail ("MulticastLoopbackChangeTcp #2");
                        } finally {
                                sock.Close ();
                        }
@@ -994,7 +989,6 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
-               [Category ("NotOnMac")] // Mac doesn't throw when overflowing the ttl
                public void TtlChangeOverflow ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1004,11 +998,9 @@ namespace MonoTests.System.Net.Sockets
                        try {
                                sock.Ttl = 256;
                                Assert.Fail ("TtlChangeOverflow #1");
-                       } catch (SocketException ex) {
-                               Assert.AreEqual (10022, ex.ErrorCode,
+                       } catch (ArgumentOutOfRangeException ex) {
+                               Assert.AreEqual ("value", ex.ParamName,
                                                 "TtlChangeOverflow #2");
-                       } catch {
-                               Assert.Fail ("TtlChangeoverflow #3");
                        } finally {
                                sock.Close ();
                        }
@@ -1021,8 +1013,6 @@ namespace MonoTests.System.Net.Sockets
                        } catch (SocketException ex) {
                                Assert.AreEqual (10022, ex.ErrorCode,
                                                 "TtlChangeOverflow #5");
-                       } catch {
-                               Assert.Fail ("TtlChangeOverflow #6");
                        } finally {
                                sock.Close ();
                        }
@@ -1136,8 +1126,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.SendTimeout = -2;
                                Assert.Fail ("SendTimeoutChange #8");
                        } catch (ArgumentOutOfRangeException) {
-                       } catch {
-                               Assert.Fail ("SendTimeoutChange #9");
                        } finally {
                                sock.Close ();
                        }
@@ -1195,8 +1183,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.ReceiveTimeout = -2;
                                Assert.Fail ("ReceiveTimeoutChange #8");
                        } catch (ArgumentOutOfRangeException) {
-                       } catch {
-                               Assert.Fail ("ReceiveTimeoutChange #9");
                        } finally {
                                sock.Close ();
                        }
@@ -1254,8 +1240,6 @@ namespace MonoTests.System.Net.Sockets
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode,
                                                 "NoDelayDefaultUdp #2");
-                       } catch {
-                               Assert.Fail ("NoDelayDefaultUdp #3");
                        } finally {
                                sock.Close ();
                        }
@@ -1274,8 +1258,6 @@ namespace MonoTests.System.Net.Sockets
                        } catch (SocketException ex) {
                                Assert.AreEqual (10042, ex.ErrorCode,
                                                 "NoDelayChangeUdp #2");
-                       } catch {
-                               Assert.Fail ("NoDelayChangeUdp #3");
                        } finally {
                                sock.Close ();
                        }
@@ -1329,7 +1311,7 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
 
-                       sock.Bind (new IPEndPoint (IPAddress.Any, 1236));
+                       sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                        
                        sock.BeginAccept (BACallback, sock);
                        
@@ -1343,7 +1325,7 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1237);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
@@ -1410,7 +1392,7 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1238);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
@@ -1478,7 +1460,7 @@ namespace MonoTests.System.Net.Sockets
                                                 ProtocolType.Udp);
                        
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1239);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
@@ -1488,8 +1470,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("BeginAcceptSocketUdp #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
-                       } catch {
-                               Assert.Fail ("BeginAcceptSocketUdp #3");
                        } finally {
                                acc.Close ();
                                sock.Close ();
@@ -1507,10 +1487,10 @@ namespace MonoTests.System.Net.Sockets
                                                 ProtocolType.Tcp);
                        
                        IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
-                                                        1240);
+                                                        NetworkHelpers.FindFreePort ());
                        
                        IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
-                                                        1241);
+                                                        NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep1);
                        sock.Listen (1);
@@ -1521,8 +1501,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.BeginAccept (acc, 256, BADCallback, sock);
                                Assert.Fail ("BeginAcceptSocketBound #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("BeginAcceptSocketBound #2");
                        } finally {
                                acc.Close ();
                                sock.Close ();
@@ -1540,7 +1518,7 @@ namespace MonoTests.System.Net.Sockets
                                                 ProtocolType.Tcp);
                        
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1242);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
@@ -1605,8 +1583,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.BeginAccept (acc, 256, BADCallback, null);
                                Assert.Fail ("BeginAcceptSocketClosed #1");
                        } catch (ObjectDisposedException) {
-                       } catch {
-                               Assert.Fail ("BeginAcceptSocketClosed #2");
                        } finally {
                                acc.Close ();
                        }
@@ -1622,7 +1598,7 @@ namespace MonoTests.System.Net.Sockets
                                                 SocketType.Stream,
                                                 ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1243);
+                                                       NetworkHelpers.FindFreePort ());
 
                        sock.Bind (ep);
                        sock.Listen (1);
@@ -1635,8 +1611,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.BeginAccept (acc, 256, BADCallback, null);
                                Assert.Fail ("BeginAcceptSocketAccClosed #1");
                        } catch (ObjectDisposedException) {
-                       } catch {
-                               Assert.Fail ("BeginAcceptSocketAccClosed #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1673,7 +1647,7 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1244);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
 
                        listen.Bind (ep);
                        listen.Listen (1);
@@ -1682,7 +1656,7 @@ namespace MonoTests.System.Net.Sockets
                        
                        BCConnected = false;
                        
-                       sock.BeginConnect (ip, 1244, BCCallback, sock);
+                       sock.BeginConnect (ip, ep.Port, BCCallback, sock);
 
                        if (BCCalledBack.WaitOne (2000, false) == false) {
                                Assert.Fail ("BeginConnectAddressPort wait timed out");
@@ -1707,8 +1681,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectAddressPortNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectAddressPortNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1721,17 +1693,15 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1245);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
 
                        sock.Bind (ep);
                        sock.Listen (1);
                        
                        try {
-                               sock.BeginConnect (ip, 1245, BCCallback, sock);
+                               sock.BeginConnect (ip, ep.Port, BCCallback, sock);
                                Assert.Fail ("BeginConnectAddressPortListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectAddressPortListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1772,7 +1742,7 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1246);
+                                                       NetworkHelpers.FindFreePort ());
                        IPAddress[] ips = new IPAddress[4];
                        
                        ips[0] = IPAddress.Parse ("127.0.0.4");
@@ -1787,7 +1757,7 @@ namespace MonoTests.System.Net.Sockets
                        
                        BCConnected = false;
                        
-                       sock.BeginConnect (ips, 1246, BCCallback, sock);
+                       sock.BeginConnect (ips, ep.Port, BCCallback, sock);
                        
                        /* Longer wait here, because the ms runtime
                         * takes a lot longer to not connect
@@ -1835,7 +1805,7 @@ namespace MonoTests.System.Net.Sockets
                         * succeed it it can connect to at least one of the requested
                         * addresses.
                         */
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 1246);
+                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        listen.Bind (ep);
                        listen.Listen (1);
@@ -1844,7 +1814,7 @@ namespace MonoTests.System.Net.Sockets
                        
                        BCConnected = false;
                        
-                       sock.BeginConnect (allIps, 1246, BCCallback, sock);
+                       sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
                        
                        /* Longer wait here, because the ms runtime
                         * takes a lot longer to not connect
@@ -1877,8 +1847,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectMultipleNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectMultipleNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1892,7 +1860,7 @@ namespace MonoTests.System.Net.Sockets
                                                  ProtocolType.Tcp);
                        IPAddress[] ips = new IPAddress[4];
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1247);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        ips[0] = IPAddress.Parse ("127.0.0.4");
                        ips[1] = IPAddress.Parse ("127.0.0.3");
@@ -1903,12 +1871,10 @@ namespace MonoTests.System.Net.Sockets
                        sock.Listen (1);
                        
                        try {
-                               sock.BeginConnect (ips, 1247, BCCallback,
+                               sock.BeginConnect (ips, ep.Port, BCCallback,
                                                   sock);
                                Assert.Fail ("BeginConnectMultipleListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectMultipleListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1945,8 +1911,6 @@ namespace MonoTests.System.Net.Sockets
                                                   BCCallback, sock);
                                Assert.Fail ("BeginConnectHostPort #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectHostPort #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1959,18 +1923,16 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1248);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
                        
                        try {
-                               sock.BeginConnect ("localhost", 1248,
+                               sock.BeginConnect ("localhost", ep.Port,
                                                   BCCallback, sock);
                                Assert.Fail ("BeginConnectHostPortListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectHostPortListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1989,8 +1951,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectHostPortNotIP #1");
                        } catch (NotSupportedException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectHostPortNotIP #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2033,12 +1993,12 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1254);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
                        
                        listen.Bind (ep);
                        listen.Listen (1);
                        
-                       sock.Connect (ip, 1254);
+                       sock.Connect (ip, ep.Port);
                        
                        Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
                        
@@ -2099,8 +2059,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("BeginSendNotConnected #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
-                       } catch {
-                               Assert.Fail ("BeginSendNotConnected #3");
                        } finally {
                                sock.Close ();
                        }
@@ -2128,9 +2086,9 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
-                                                       1256);
+                                                       NetworkHelpers.FindFreePort ());
                        IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
-                                                        1257);
+                                                        NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep1);
                        
@@ -2139,8 +2097,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("BindTwice #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
-                       } catch {
-                               Assert.Fail ("BindTwice #3");
                        } finally {
                                sock.Close ();
                        }
@@ -2156,7 +2112,7 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1258);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        listen.Bind (ep);
                        listen.Listen (1);
@@ -2184,12 +2140,12 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1249);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
 
                        listen.Bind (ep);
                        listen.Listen (1);
                        
-                       sock.Connect (ip, 1249);
+                       sock.Connect (ip, ep.Port);
                        
                        Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
                        
@@ -2209,8 +2165,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.Connect (ip, 1249);
                                Assert.Fail ("ConnectAddressPortNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("ConnectAddressPortNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2223,17 +2177,15 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1250);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
 
                        sock.Bind (ep);
                        sock.Listen (1);
                        
                        try {
-                               sock.Connect (ip, 1250);
+                               sock.Connect (ip, ep.Port);
                                Assert.Fail ("ConnectAddressPortListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("ConnectAddressPortListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2281,7 +2233,7 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1251);
+                                                       NetworkHelpers.FindFreePort ());
                        IPAddress[] ips = new IPAddress[4];
                        
                        ips[0] = IPAddress.Parse ("127.0.0.4");
@@ -2292,7 +2244,7 @@ namespace MonoTests.System.Net.Sockets
                        listen.Bind (ep);
                        listen.Listen (1);
                        
-                       sock.Connect (ips, 1251);
+                       sock.Connect (ips, ep.Port);
                        
                        Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
                        Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
@@ -2327,12 +2279,12 @@ namespace MonoTests.System.Net.Sockets
                         * Bind to IPAddress.Any; Connect() will fail unless it can
                         * connect to all the addresses in allIps.
                         */
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Any, 1251);
+                       IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
 
                        listen.Bind (ep);
                        listen.Listen (1);
                        
-                       sock.Connect (allIps, 1251);
+                       sock.Connect (allIps, ep.Port);
                        
                        Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
                        Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
@@ -2356,8 +2308,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.Connect (ips, 1251);
                                Assert.Fail ("ConnectMultipleNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("ConnectMultipleNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2371,7 +2321,7 @@ namespace MonoTests.System.Net.Sockets
                                                  ProtocolType.Tcp);
                        IPAddress[] ips = new IPAddress[4];
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
-                                                       1252);
+                                                       NetworkHelpers.FindFreePort ());
                        
                        ips[0] = IPAddress.Parse ("127.0.0.4");
                        ips[1] = IPAddress.Parse ("127.0.0.3");
@@ -2382,11 +2332,9 @@ namespace MonoTests.System.Net.Sockets
                        sock.Listen (1);
                        
                        try {
-                               sock.Connect (ips, 1252);
+                               sock.Connect (ips, ep.Port);
                                Assert.Fail ("ConnectMultipleListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("ConnectMultipleListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2422,8 +2370,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.Connect ((string)null, 0);
                                Assert.Fail ("ConnectHostPort #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("ConnectHostPort #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2436,17 +2382,15 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1253);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
                        
                        sock.Bind (ep);
                        sock.Listen (1);
                        
                        try {
-                               sock.Connect ("localhost", 1253);
+                               sock.Connect ("localhost", ep.Port);
                                Assert.Fail ("ConnectHostPortListen #1");
                        } catch (InvalidOperationException) {
-                       } catch {
-                               Assert.Fail ("ConnectHostPortListen #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2464,8 +2408,6 @@ namespace MonoTests.System.Net.Sockets
                                sock.Connect ("localhost", 0);
                                Assert.Fail ("ConnectHostPortNotIP #1");
                        } catch (NotSupportedException) {
-                       } catch {
-                               Assert.Fail ("ConnectHostPortNotIP #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2495,12 +2437,12 @@ namespace MonoTests.System.Net.Sockets
                                                    SocketType.Stream,
                                                    ProtocolType.Tcp);
                        IPAddress ip = IPAddress.Loopback;
-                       IPEndPoint ep = new IPEndPoint (ip, 1255);
+                       IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
                        
                        listen.Bind (ep);
                        listen.Listen (1);
                        
-                       sock.Connect (ip, 1255);
+                       sock.Connect (ip, ep.Port);
                        
                        Assert.AreEqual (true, sock.Connected, "Disconnect #1");
                        
@@ -2547,7 +2489,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        int i;
 
-                       IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, 1258);
+                       IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        listensock.Bind (endpoint);
@@ -2604,7 +2546,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        int i;
 
-                       IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, 1259);
+                       IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        listensock.Bind (endpoint);
@@ -2669,8 +2611,6 @@ namespace MonoTests.System.Net.Sockets
                                Assert.Fail ("ListenNotBound #1");
                        } catch (SocketException ex) {
                                Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
-                       } catch {
-                               Assert.Fail ("ListenNotBound #3");
                        } finally {
                                sock.Close ();
                        }
@@ -2700,7 +2640,7 @@ namespace MonoTests.System.Net.Sockets
                                                SocketType.Dgram,
                                                ProtocolType.Udp);
                        CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
-                                                       1256));
+                                                       NetworkHelpers.FindFreePort ()));
                        
                        Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
                        CWRReady.Reset ();
@@ -2718,7 +2658,7 @@ namespace MonoTests.System.Net.Sockets
                static bool RRCLastRead = false;
                static ManualResetEvent RRCReady = new ManualResetEvent (false);
                
-               private static void RRCClientThread ()
+               private static void RRCClientThread (int port)
                {
                        byte[] bytes = new byte[8];
                        int readbyte;
@@ -2727,7 +2667,7 @@ namespace MonoTests.System.Net.Sockets
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
                        sock.Connect (new IPEndPoint (IPAddress.Loopback,
-                                                     1257));
+                                                     port));
                        
                        NetworkStream stream = new NetworkStream (sock);
 
@@ -3068,7 +3008,7 @@ namespace MonoTests.System.Net.Sockets
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
                                ProtocolType.Tcp);
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, ref remoteEP);
                                Assert.Fail ("#1");
@@ -3110,7 +3050,7 @@ namespace MonoTests.System.Net.Sockets
                                ProtocolType.Tcp);
                        s.Close ();
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, ref remoteEP);
                                Assert.Fail ("#1");
@@ -3129,7 +3069,7 @@ namespace MonoTests.System.Net.Sockets
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
                                ProtocolType.Tcp);
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
                                Assert.Fail ("#1");
@@ -3171,7 +3111,7 @@ namespace MonoTests.System.Net.Sockets
                                ProtocolType.Tcp);
                        s.Close ();
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
                                Assert.Fail ("#1");
@@ -3190,7 +3130,7 @@ namespace MonoTests.System.Net.Sockets
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
                                ProtocolType.Tcp);
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
                                        ref remoteEP);
@@ -3231,7 +3171,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        Socket s;
                        byte [] buffer = new byte [5];
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        // size negative
                        s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3274,7 +3214,7 @@ namespace MonoTests.System.Net.Sockets
                                ProtocolType.Tcp);
                        s.Close ();
 
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
                                        ref remoteEP);
@@ -3293,7 +3233,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
                                ProtocolType.Tcp);
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        try {
                                s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
@@ -3312,7 +3252,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        Socket s;
                        byte [] buffer = new byte [5];
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        // offset negative
                        s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3375,7 +3315,7 @@ namespace MonoTests.System.Net.Sockets
                {
                        Socket s;
                        byte [] buffer = new byte [5];
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
 
                        // size negative
                        s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3436,7 +3376,7 @@ namespace MonoTests.System.Net.Sockets
                        s.Close ();
 
                        byte [] buffer = new byte [5];
-                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        try {
                                s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
                                        ref remoteEP);
@@ -3453,14 +3393,15 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void ReceiveRemoteClosed ()
                {
+                       var port = NetworkHelpers.FindFreePort ();
                        Socket sock = new Socket (AddressFamily.InterNetwork,
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
-                       sock.Bind (new IPEndPoint (IPAddress.Loopback, 1257));
+                       sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
                        sock.Listen (1);
                        
                        RRCReady.Reset ();
-                       Thread client_thread = new Thread (new ThreadStart (RRCClientThread));
+                       Thread client_thread = new Thread (() => RRCClientThread (port));
                        client_thread.Start ();
                        
                        Socket client = sock.Accept ();
@@ -3479,42 +3420,34 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void UdpDoubleBind ()
                {
-                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
-                       
-                       s.Bind (new IPEndPoint (IPAddress.Any, 12345));
-                       
-                       Socket ss = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
-                       
-                       ss.Bind (new IPEndPoint (IPAddress.Any, 12345));
+                       using (Socket s = new Socket (AddressFamily.InterNetwork,
+                                               SocketType.Dgram, ProtocolType.Udp))
+                       using (Socket ss = new Socket (AddressFamily.InterNetwork,
+                                               SocketType.Dgram, ProtocolType.Udp)) {
+                               var supportsReuseAddress = true;
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+                               } catch (SocketException e) {
+                                       // Exception is thrown when ReuseAddress is not supported
+                                       Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
+                                                       "Expected SocketError.OperationNotSupported");
+                                       supportsReuseAddress = false;
+                               }
 
-                       // If we make it this far, we succeeded.
-                       
-                       ss.Close ();
-                       s.Close ();
-               }
+                               var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
+                               s.Bind (ep);
 
-#if MONOTOUCH
-               // when the linker is enabled then reflection won't work and would throw an NRE
-               // this is also always true for iOS - so we do not need to poke internals
-               static bool SupportsPortReuse ()
-               {
-                       return true;
-               }
-#else
-               static bool? supportsPortReuse;
-               static bool SupportsPortReuse ()
-               {
-                       if (supportsPortReuse.HasValue)
-                               return supportsPortReuse.Value;
+                               if (supportsReuseAddress)
+                                       ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
 
-                       supportsPortReuse = (bool) typeof (Socket).GetMethod ("SupportsPortReuse",
-                                       BindingFlags.Static | BindingFlags.NonPublic)
-                                       .Invoke (null, new object [] {});
-                       return supportsPortReuse.Value;
+                               try {
+                                       ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
+                                       if (!supportsReuseAddress)
+                                               Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
+                               } catch (SocketException e) {
+                               }
+                       }
                }
-#endif
 
                // Test case for bug #31557
                [Test]
@@ -3524,22 +3457,30 @@ namespace MonoTests.System.Net.Sockets
                                                SocketType.Stream, ProtocolType.Tcp))
                        using (Socket ss = new Socket (AddressFamily.InterNetwork,
                                                SocketType.Stream, ProtocolType.Tcp)) {
-                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+                               var supportsReuseAddress = true;
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+                               } catch (SocketException e) {
+                                       // Exception is thrown when ReuseAddress is not supported
+                                       Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
+                                                       "Expected SocketError.OperationNotSupported");
+                                       supportsReuseAddress = false;
+                               }
 
-                               s.Bind (new IPEndPoint (IPAddress.Any, 12345));
+                               var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
+                               s.Bind (ep);
                                s.Listen(1);
 
-                               ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+                               if (supportsReuseAddress)
+                                       ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
 
-                               Exception ex = null;
                                try {
-                                       ss.Bind (new IPEndPoint (IPAddress.Any, 12345));
+                                       ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
                                        ss.Listen(1);
+                                       if (!supportsReuseAddress)
+                                               Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
                                } catch (SocketException e) {
-                                       ex = e;
                                }
-
-                               Assert.AreEqual (SupportsPortReuse (), ex == null);
                        }
                }
 
@@ -3547,11 +3488,11 @@ namespace MonoTests.System.Net.Sockets
                [Category ("NotOnMac")]
                 public void ConnectedProperty ()
                 {
-                       TcpListener listener = new TcpListener (IPAddress.Loopback, 23456);
+                       TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                        listener.Start();
 
                        Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                       client.Connect (IPAddress.Loopback, 23456);
+                       client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
                        Socket server = listener.AcceptSocket ();
 
                        try {
@@ -3753,7 +3694,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
 
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                                try {
                                        s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                                new IPv6MulticastOption (mcast_addr));
@@ -3775,7 +3716,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
 
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                                s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption (mcast_addr));
                        }
@@ -3814,7 +3755,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
 
                        using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
                                s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
                                        new IPv6MulticastOption (mcast_addr));
                        }
@@ -3829,7 +3770,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
 
                        using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
                                try {
                                        s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
                                                new MulticastOption (mcast_addr));
@@ -3980,7 +3921,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
 
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                                s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption (mcast_addr));
                                try {
@@ -4006,7 +3947,7 @@ namespace MonoTests.System.Net.Sockets
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
                                MulticastOption option = new MulticastOption (mcast_addr);
 
-                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
                                s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        option);
                                s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
@@ -4065,7 +4006,7 @@ namespace MonoTests.System.Net.Sockets
                        IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
 
                        using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
-                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
                                s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
                                        new IPv6MulticastOption (mcast_addr));
                                try {
@@ -4194,7 +4135,7 @@ namespace MonoTests.System.Net.Sockets
                public void Shutdown_NoConnect ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                       s.Bind (new IPEndPoint (IPAddress.Loopback, 0));
+                       s.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
                        s.Listen (1);
                        try {
                                s.Shutdown (SocketShutdown.Both);
@@ -4289,7 +4230,22 @@ namespace MonoTests.System.Net.Sockets
                [Test]
                public void SendAsyncFile ()
                {
-                       Socket serverSocket = StartSocketServer ();
+                       Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+
+                       serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
+                       serverSocket.Listen (1);
+
+                       var mReceived = new ManualResetEvent (false);
+
+                       serverSocket.BeginAccept (AsyncCall => {
+                               byte[] bytes = new byte [1024];
+
+                               Socket listener = (Socket)AsyncCall.AsyncState;
+                               Socket client = listener.EndAccept (AsyncCall);
+                               client.Receive (bytes, bytes.Length, 0);
+                               client.Close ();
+                               mReceived.Set ();
+                       }, serverSocket);
                        
                        Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        clientSocket.Connect (serverSocket.LocalEndPoint);
@@ -4307,18 +4263,19 @@ namespace MonoTests.System.Net.Sockets
                                        sw.Write (buffer);
                                }
 
-                               var m = new ManualResetEvent (false);
+                               var mSent = new ManualResetEvent (false);
 
                                // Async Send File to server
                                clientSocket.BeginSendFile(temp, (ar) => {
                                        Socket client = (Socket) ar.AsyncState;
                                        client.EndSendFile (ar);
-                                       m.Set ();
+                                       mSent.Set ();
                                }, clientSocket);
 
-                               if (!m.WaitOne (1500))
+                               if (!mSent.WaitOne (1500))
+                                       throw new TimeoutException ();
+                               if (!mReceived.WaitOne (1500))
                                        throw new TimeoutException ();
-                               m.Reset ();
                        } finally {
                                if (File.Exists (temp))
                                        File.Delete (temp);
@@ -4332,7 +4289,7 @@ namespace MonoTests.System.Net.Sockets
                public void ConnectToIPV4EndPointUsingDualModelSocket () {
                        using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
                        using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
-                               var host = new IPEndPoint (IPAddress.Loopback, 0);
+                               var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                                        
                                server.Bind (host);
                                server.Listen (0);
@@ -4354,7 +4311,7 @@ namespace MonoTests.System.Net.Sockets
                public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
                        using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
                        using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
-                               var host = new IPEndPoint (IPAddress.Loopback, 0);
+                               var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
                                        
                                server.Bind (host);
                                server.Listen (0);
@@ -4378,42 +4335,35 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
 
-               Socket StartSocketServer ()
-               {
-
-                       Socket listenSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                       
-                       listenSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
-                       listenSocket.Listen (1);
-
-                       listenSocket.BeginAccept (new AsyncCallback (ReceiveCallback), listenSocket);
-                       
-                       return listenSocket;
-               }
-
-               public static void ReceiveCallback (IAsyncResult AsyncCall)
-               {
-                       byte[] bytes = new byte [1024];
-
-                       Socket listener = (Socket)AsyncCall.AsyncState;
-                       Socket client = listener.EndAccept (AsyncCall);
-                       client.Receive (bytes, bytes.Length, 0);
-                       client.Close ();
-               }
-
                [Test]
                public void UdpMulticasTimeToLive ()
                {
                        /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
 
                        using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
-                               IPEndPoint end_point = new IPEndPoint (IPAddress.Any, 11000);
+                               IPEndPoint end_point = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
                                socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
                                socket.Bind (end_point);
                                socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);
                        }
                }
+
+               [Test] // Covers 41616
+               public void ConnectAsyncUnhandledEx ()
+               {
+                       var mre = new ManualResetEvent (false);
+
+                       var endPoint = new IPEndPoint(0,0);
+                       var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Unspecified);
+
+                       var socketArgs = new SocketAsyncEventArgs();
+                       socketArgs.RemoteEndPoint = endPoint;
+                       socketArgs.Completed += (sender, e) => mre.Set ();
+
+                       socket.ConnectAsync (socketArgs);
+
+                       Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");
+               }
        }
 }