Merge pull request #3007 from directhex/use-mingw64
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketTest.cs
index 0d2dea47a73f5244dbac722c16b7ab8768e79e23..d52438fb15fa4fcb4ba230fa804cecad8893f404 100755 (executable)
@@ -22,6 +22,8 @@ using System.IO;
 
 using System.Collections.Generic;
 
+using MonoTests.Helpers;
+
 namespace MonoTests.System.Net.Sockets
 {
        [TestFixture]
@@ -34,7 +36,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 +66,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 +113,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 +157,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 +211,7 @@ namespace MonoTests.System.Net.Sockets
                         * anything...
                         */
                        sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
-                                                          114),
+                                                          NetworkHelpers.FindFreePort ()),
                                           new AsyncCallback (CFACallback),
                                           sock);
                        CFACalledBack.WaitOne ();
@@ -219,7 +222,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 +233,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 +263,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 +372,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 +383,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 +394,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 +405,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 +427,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 +573,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 +590,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 +619,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 +679,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 +787,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 +804,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 ();
                        }
@@ -1007,8 +1000,6 @@ namespace MonoTests.System.Net.Sockets
                        } catch (SocketException ex) {
                                Assert.AreEqual (10022, ex.ErrorCode,
                                                 "TtlChangeOverflow #2");
-                       } catch {
-                               Assert.Fail ("TtlChangeoverflow #3");
                        } finally {
                                sock.Close ();
                        }
@@ -1021,8 +1012,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 +1125,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 +1182,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 +1239,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 +1257,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 +1310,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 +1324,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 +1391,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 +1459,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 +1469,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 +1486,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 +1500,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 +1517,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 +1582,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 +1597,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 +1610,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 +1646,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 +1655,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 +1680,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectAddressPortNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectAddressPortNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1721,17 +1692,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 +1741,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 +1756,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 +1804,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 +1813,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 +1846,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectMultipleNull #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectMultipleNull #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1892,7 +1859,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 +1870,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 +1910,6 @@ namespace MonoTests.System.Net.Sockets
                                                   BCCallback, sock);
                                Assert.Fail ("BeginConnectHostPort #1");
                        } catch (ArgumentNullException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectHostPort #2");
                        } finally {
                                sock.Close ();
                        }
@@ -1959,18 +1922,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 +1950,6 @@ namespace MonoTests.System.Net.Sockets
                                                   sock);
                                Assert.Fail ("BeginConnectHostPortNotIP #1");
                        } catch (NotSupportedException) {
-                       } catch {
-                               Assert.Fail ("BeginConnectHostPortNotIP #2");
                        } finally {
                                sock.Close ();
                        }
@@ -2033,12 +1992,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 +2058,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 +2085,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 +2096,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 +2111,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 +2139,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 +2164,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 +2176,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 +2232,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 +2243,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 +2278,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 +2307,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 +2320,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 +2331,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 +2369,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 +2381,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 +2407,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 +2436,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 +2488,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 +2545,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 +2610,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 +2639,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 +2657,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 +2666,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 +3007,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 +3049,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 +3068,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 +3110,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 +3129,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 +3170,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 +3213,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 +3232,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 +3251,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 +3314,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 +3375,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 +3392,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,32 +3419,33 @@ 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);
 
-               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) {
+                               }
+                       }
                }
 
                // Test case for bug #31557
@@ -3515,22 +3456,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);
                        }
                }
 
@@ -3538,11 +3487,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 {
@@ -3744,7 +3693,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));
@@ -3766,7 +3715,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));
                        }
@@ -3805,7 +3754,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));
                        }
@@ -3820,7 +3769,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));
@@ -3971,7 +3920,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 {
@@ -3997,7 +3946,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,
@@ -4056,7 +4005,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 {
@@ -4185,7 +4134,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);
@@ -4319,12 +4268,62 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
                
+               [Test]
+               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, NetworkHelpers.FindFreePort ());
+                                       
+                               server.Bind (host);
+                               server.Listen (0);
+                               
+                               var ep = server.LocalEndPoint as IPEndPoint;
+                               
+                               client.Connect (ep);
+                               client.Disconnect (true);
+                               
+                               client.Connect (IPAddress.Loopback, ep.Port);
+                               client.Disconnect (true);
+                               
+                               client.Connect (new [] {IPAddress.Loopback}, ep.Port);
+                               client.Disconnect (true);
+                       }
+               }
+               
+               [Test]
+               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, NetworkHelpers.FindFreePort ());
+                                       
+                               server.Bind (host);
+                               server.Listen (0);
+                               
+                               var ep = server.LocalEndPoint as IPEndPoint;
+                               
+                               BCCalledBack.Reset ();
+                               var ar1 = client.BeginConnect (ep, BCCallback, client);
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
+                               client.Disconnect (true);
+                               
+                               BCCalledBack.Reset ();
+                               var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
+                               client.Disconnect (true);
+                               
+                               BCCalledBack.Reset ();
+                               var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
+                               client.Disconnect (true);
+                       }
+               }
+
                Socket StartSocketServer ()
                {
 
                        Socket listenSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        
-                       listenSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
+                       listenSocket.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
                        listenSocket.Listen (1);
 
                        listenSocket.BeginAccept (new AsyncCallback (ReceiveCallback), listenSocket);
@@ -4349,7 +4348,7 @@ namespace MonoTests.System.Net.Sockets
                        /* 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);