using System; using System.Net; using System.Net.Sockets; using System.ServiceModel; using System.Threading; using DistributedGA.Core.Domain; using DistributedGA.Core.Interface; namespace DistributedGA.Core.Implementation { public class WcfMessageService : IMessageService { public event EventHandler OnDataRecieved; private static ManualResetEvent _ResetEvent = new ManualResetEvent(false); private IMessageContract messageContract = null; public int Init(string ip) { int port = 0; port = FreeTcpPort(); messageContract = new MessageContractImpl(); messageContract.MessageRecieved += new EventHandler(OnMessageRecieved); var serviceUrl = "DistributedGA.svc"; new Thread(() => { var baseUri = new Uri(string.Concat("http://", ip, ":", port, "/DistributedGA")); var serviceUri = new Uri(baseUri, serviceUrl); BasicHttpBinding binding = new BasicHttpBinding(); //using (var host = new ServiceHost(typeof(MessageContractImpl), serviceUri)) using (var host = new ServiceHost(messageContract, serviceUri)) { host.AddServiceEndpoint(typeof(IMessageContract), binding, serviceUri); host.Open(); _ResetEvent.WaitOne(); } }).Start(); //close service again: // _ResetEvent.Set(); return port; } public void Dispose() { _ResetEvent.Set(); } private int FreeTcpPort() { TcpListener l = new TcpListener(IPAddress.Loopback, 0); l.Start(); int port = ((IPEndPoint)l.LocalEndpoint).Port; l.Stop(); return port; } private void OnMessageRecieved(object sender, MessageRecieveEventArgs e) { if (OnDataRecieved != null) { OnDataRecieved(this, e); } } } }