diff --git a/src/Mono.Ssdp/Mono.Ssdp/Mono.Ssdp/MulticastReader.cs b/src/Mono.Ssdp/Mono.Ssdp/Mono.Ssdp/MulticastReader.cs index c3356ea4..089619d4 100644 --- a/src/Mono.Ssdp/Mono.Ssdp/Mono.Ssdp/MulticastReader.cs +++ b/src/Mono.Ssdp/Mono.Ssdp/Mono.Ssdp/MulticastReader.cs @@ -47,14 +47,24 @@ internal void AsyncReadResult (SsdpSocket socket) void AsyncReadResult (AsyncReceiveBuffer buffer) { - buffer.Socket.BeginReceiveFrom (buffer, OnAsyncResultReceived); + try { + buffer.Socket.BeginReceiveFrom (buffer, OnAsyncResultReceived); + } catch (ObjectDisposedException) { + // Socket disposed while we were receiving from it... just ignore this + } } void OnAsyncResultReceived (IAsyncResult asyncResult) { var buffer = (AsyncReceiveBuffer)asyncResult.AsyncState; - buffer.BytesReceived = buffer.Socket.EndReceiveFrom (asyncResult, ref buffer.SenderEndPoint); - + + try { + buffer.BytesReceived = buffer.Socket.EndReceiveFrom (asyncResult, ref buffer.SenderEndPoint); + } catch (ObjectDisposedException) { + // Socket already disposed... just ignore this and exit + return; + } + if (OnAsyncResultReceived (buffer)) { AsyncReadResult (buffer); } else { diff --git a/tests/Mono.Ssdp.Tests/ServerTests.cs b/tests/Mono.Ssdp.Tests/ServerTests.cs index 6fff5af2..6479efb5 100644 --- a/tests/Mono.Ssdp.Tests/ServerTests.cs +++ b/tests/Mono.Ssdp.Tests/ServerTests.cs @@ -44,14 +44,15 @@ public class ServerTests readonly object mutex = new object (); -// static Socket CreateMulticastSocket () -// { -// var socket = CreateSocket (); -// socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); -// socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4); -// socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption (ipaddress, 0)); -// return socket; -// } + static Socket CreateMulticastSocket () + { + var socket = CreateSocket (); + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4); + socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption (ipaddress, 0)); + return socket; + } static Socket CreateSocket () { @@ -63,21 +64,22 @@ static Socket CreateSocket () [Test] public void AnnouncementTest () { - using (var socket = CreateSocket ()) { + using (var socket = CreateMulticastSocket ()) { using (var server = new Server ()) { - socket.Bind (ip_endpoint); - var buffer = new byte[1024]; - socket.BeginReceiveFrom (buffer, 0, buffer.Length, SocketFlags.None, ref endpoint, - result => { - lock (mutex) { - socket.EndReceiveFrom (result, ref endpoint); - var datagram = Encoding.ASCII.GetString (buffer, 0, buffer.Length); - Assert.IsTrue (datagram.StartsWith ("NOTIFY * HTTP/1.1\r\n")); - Monitor.Pulse (mutex); - } - }, null - ); lock (mutex) { + socket.Bind (endpoint); + var buffer = new byte[1024]; + socket.BeginReceiveFrom (buffer, 0, buffer.Length, SocketFlags.None, ref endpoint, + result => { + lock (mutex) { + socket.EndReceiveFrom (result, ref endpoint); + var datagram = Encoding.ASCII.GetString (buffer, 0, buffer.Length); + Assert.IsTrue (datagram.StartsWith ("NOTIFY * HTTP/1.1\r\n")); + Monitor.Pulse (mutex); + } + }, null + ); + server.Announce ("test-service", "test1", "http://localhost/"); if (!Monitor.Wait (mutex, TimeSpan.FromSeconds (5))) { Assert.Fail ("The server notification timed out.");