using System.Net.Sockets;
using System.ServiceModel;
using System.ServiceModel.Channels;
+using System.Threading;
namespace System.ServiceModel.Discovery
{
FillMessageEncoder (listener.Context);
}
- MessageEncoder message_encoder; // FIXME: fill it
+ MessageEncoder message_encoder;
UdpClient client;
+ IPAddress multicast_address;
UdpTransportBindingElement binding_element;
// for servers
Send (message, DefaultSendTimeout);
}
+ static readonly Random rnd = new Random ();
+
public void Send (Message message, TimeSpan timeout)
{
if (State != CommunicationState.Opened)
var ms = new MemoryStream ();
message_encoder.WriteMessage (message, ms);
client.Send (ms.GetBuffer (), (int) ms.Length);
+ // FIXME: use MaxAnnouncementDelay. It is fixed now.
+ Thread.Sleep (rnd.Next (500, 500));
}
public bool WaitForMessage (TimeSpan timeout)
protected override void OnClose (TimeSpan timeout)
{
- if (client != null)
+ if (client != null) {
+ if (multicast_address != null) {
+ client.DropMulticastGroup (multicast_address, LocalAddress.Uri.Port);
+ multicast_address = null;
+ }
client.Close ();
+ }
client = null;
}
bool isMulticast = NetworkInterface.GetAllNetworkInterfaces ().Any (nic => nic.SupportsMulticast && nic.GetIPProperties ().MulticastAddresses.Any (mca => mca.Address.Equals (ip)));
int port = LocalAddress.Uri.Port;
if (isMulticast) {
+ multicast_address = ip;
client = new UdpClient (new IPEndPoint (IPAddress.Any, port));
client.JoinMulticastGroup (ip, binding_element.TransportSettings.TimeToLive);
}