Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System / Test / System.Net / SocketResponder.cs
index dd932ec4df0b30b07fb02452bbf84108559b0c85..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)
                {
@@ -97,6 +98,7 @@ namespace MonoTests.System.Net
                                if (tcpListener != null) {
                                        tcpListener.Stop ();
                                        tcpListener = null;
+                                       Thread.Sleep (50);
                                }
                        }
                }
@@ -104,20 +106,23 @@ namespace MonoTests.System.Net
                private void Listen ()
                {
                        while (!_stopped) {
+                               Socket socket = null;
                                try {
-                                       Socket socket = tcpListener.AcceptSocket ();
+                                       socket = tcpListener.AcceptSocket ();
                                        socket.Send (_requestHandler (socket));
                                        try {
                                                socket.Shutdown (SocketShutdown.Receive);
                                                socket.Shutdown (SocketShutdown.Send);
                                        } catch {
                                        }
-                                       Thread.Sleep (500);
-                                       socket.Close ();
                                } 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 ();
                                }
                        }
                }