From 37f6746abc5024bbb3015d044d74a4e47bbd36b8 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 29 Sep 2010 20:47:10 +0900 Subject: [PATCH] [wcf-discovery] Fix MessageEncoder retrieval, failure on EndReceive and ExclusiveAddressUse. --- .../System.ServiceModel.Discovery.Udp/UdpDuplexChannel.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Udp/UdpDuplexChannel.cs b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Udp/UdpDuplexChannel.cs index 58492eef2b9..48ef6b65018 100644 --- a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Udp/UdpDuplexChannel.cs +++ b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Udp/UdpDuplexChannel.cs @@ -78,7 +78,7 @@ namespace System.ServiceModel.Discovery.Udp void FillMessageEncoder (BindingContext ctx) { - var mbe = (MessageEncodingBindingElement) ctx.RemainingBindingElements.FirstOrDefault (be => be is MessageEncodingBindingElement); + var mbe = (MessageEncodingBindingElement) ctx.Binding.Elements.FirstOrDefault (be => be is MessageEncodingBindingElement); if (mbe == null) mbe = new TextMessageEncodingBindingElement (); message_encoder = mbe.CreateMessageEncoderFactory ().Encoder; @@ -160,8 +160,16 @@ namespace System.ServiceModel.Discovery.Udp byte [] bytes = null; IPEndPoint ip = new IPEndPoint (IPAddress.Any, 0); var ar = client.BeginReceive (delegate (IAsyncResult result) { - bytes = client.EndReceive (result, ref ip); - }, null); +if (result == null) throw new ArgumentNullException ("result"); + UdpClient cli = (UdpClient) result.AsyncState; + try { + bytes = cli.EndReceive (result, ref ip); + } catch (ObjectDisposedException) { + if (State == CommunicationState.Opened) + throw; + // Otherwise, called during shutdown. Ignore it. + } + }, client); if (!ar.IsCompleted && !ar.AsyncWaitHandle.WaitOne (timeout)) return false; @@ -244,6 +252,7 @@ namespace System.ServiceModel.Discovery.Udp if (isMulticast) { multicast_address = ip; client = new UdpClient (new IPEndPoint (IPAddress.Any, port)); + client.ExclusiveAddressUse = false; client.JoinMulticastGroup (ip, binding_element.TransportSettings.TimeToLive); } else -- 2.11.4.GIT