Merge pull request #217 from QuickJack/master
[mono.git] / mcs / class / System / Test / System.Net / SocketResponder.cs
index 07525a78db380949e71c4a938884c1a268439479..6ee086f60746c2bca7cfa70d505e0aed404edd62 100644 (file)
@@ -48,6 +48,7 @@ namespace MonoTests.System.Net
                private readonly object _syncRoot = new object ();
 
                private const int SOCKET_CLOSED = 10004;
+               private const int SOCKET_INVALID_ARGS = 10022;
 
                public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
                {
@@ -81,9 +82,10 @@ namespace MonoTests.System.Net
                                if (!_stopped)
                                        return;
                                _stopped = false;
+                               tcpListener = new TcpListener (LocalEndPoint);
+                               tcpListener.Start ();
                                listenThread = new Thread (new ThreadStart (Listen));
                                listenThread.Start ();
-                               Thread.Sleep (20); // allow listener to start
                        }
                }
 
@@ -96,25 +98,31 @@ namespace MonoTests.System.Net
                                if (tcpListener != null) {
                                        tcpListener.Stop ();
                                        tcpListener = null;
+                                       Thread.Sleep (50);
                                }
                        }
                }
 
                private void Listen ()
                {
-                       tcpListener = new TcpListener (LocalEndPoint);
-                       tcpListener.Start ();
                        while (!_stopped) {
+                               Socket socket = null;
                                try {
-                                       Socket socket = tcpListener.AcceptSocket ();
+                                       socket = tcpListener.AcceptSocket ();
                                        socket.Send (_requestHandler (socket));
-                                       socket.Shutdown (SocketShutdown.Send);
-                                       Thread.Sleep (500);
-                                       socket.Close ();
+                                       try {
+                                               socket.Shutdown (SocketShutdown.Receive);
+                                               socket.Shutdown (SocketShutdown.Send);
+                                       } catch {
+                                       }
                                } catch (SocketException ex) {
                                        // ignore interruption of blocking call
-                                       if (ex.ErrorCode != SOCKET_CLOSED)
+                                       if (ex.ErrorCode != SOCKET_CLOSED && ex.ErrorCode != SOCKET_INVALID_ARGS)
                                                throw;
+                               } finally {
+                                       Thread.Sleep (500);
+                                       if (socket != null)
+                                               socket.Close ();
                                }
                        }
                }