Free cookie consent management tool by TermsFeed Policy Generator

source: branches/thasling/DistributedGA/DistributedGA.Core/Implementation/WcfMessageService.cs @ 13923

Last change on this file since 13923 was 13923, checked in by thasling, 8 years ago

#2615:
re-implemented WcfPeerListManager
also sending messages is now done in the background async

File size: 2.0 KB
Line 
1using System;
2using System.Net;
3using System.Net.Sockets;
4using System.ServiceModel;
5using System.Threading;
6using DistributedGA.Core.Domain;
7using DistributedGA.Core.Interface;
8
9namespace DistributedGA.Core.Implementation
10{
11    public class WcfMessageService : IMessageService
12    {
13        public event EventHandler<MessageRecieveEventArgs> OnDataRecieved;
14
15        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);
16
17        private IMessageContract messageContract = null;
18
19        public int Init(string ip)
20        {
21            int port = 0;
22            port = FreeTcpPort();
23
24            messageContract = new MessageContractImpl();
25            messageContract.MessageRecieved += new EventHandler<MessageRecieveEventArgs>(OnMessageRecieved);
26
27            var serviceUrl = "DistributedGA.svc";
28            new Thread(() =>
29            {
30                var baseUri = new Uri(string.Concat("net.tcp://", ip, ":", port, "/DistributedGA"));
31                var serviceUri = new Uri(baseUri, serviceUrl);
32                NetTcpBinding binding = new NetTcpBinding();
33
34                using (var host = new ServiceHost(messageContract, serviceUri))
35                {
36                    host.AddServiceEndpoint(typeof(IMessageContract), binding, serviceUri);
37
38                    host.Open();
39
40                    _ResetEvent.WaitOne();
41                }
42            }).Start();
43            return port;
44        }
45
46        public void Dispose()
47        {
48            _ResetEvent.Set();
49        }
50
51        private int FreeTcpPort()
52        {
53            TcpListener l = new TcpListener(IPAddress.Loopback, 0);
54            l.Start();
55            int port = ((IPEndPoint)l.LocalEndpoint).Port;
56            l.Stop();
57            return port;
58        }
59
60        private void OnMessageRecieved(object sender, MessageRecieveEventArgs e)
61        {
62            if (OnDataRecieved != null)
63            {
64                OnDataRecieved(this, e);
65            }
66        }
67    }
68}
Note: See TracBrowser for help on using the repository browser.