source: trunk/CrypPlugins/KeySearcher/Server/Server.cs @ 2214

Last change on this file since 2214 was 2214, checked in by Sven Rech, 11 years ago

keysearcher

File size: 4.6 KB
Line 
1using System;
2using System.Text;
3using System.Net.Sockets;
4using System.Threading;
5using System.Net;
6using System.Collections.Generic;
7
8class CryptoolServer
9{
10    public int Port {get;set;}
11   
12    public delegate void JobCompletedDelegate(EndPoint ipep, JobResult j);
13    public event JobCompletedDelegate OnJobCompleted;
14
15
16    public delegate void ClientConnectedDelegate(EndPoint ipep, String identification);
17    public event ClientConnectedDelegate OnClientConnected;
18
19    public delegate void ClientDisconnectedDelegate(EndPoint ipep);
20    public event ClientDisconnectedDelegate OnClientDisconnected;
21
22    private Dictionary<EndPoint, TcpClient> connectedClients = new Dictionary<EndPoint, TcpClient>();
23
24    ///<summary>
25    /// Starts the server. Will block forever, you might want to start this in an additional thread.
26    ///</summary>
27    public void Run()
28    {
29        TcpListener tcpListener = null;
30        try
31        {
32            tcpListener = new TcpListener(IPAddress.Any, Port);
33            tcpListener.Start();
34            Console.WriteLine("Listening for client on port " + Port);
35            while (true)
36            {
37                TcpClient client = tcpListener.AcceptTcpClient();
38                Console.WriteLine("Got connection from " + client);
39                lock (connectedClients)
40                {
41                    connectedClients.Add(client.Client.RemoteEndPoint, client);
42                }
43                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
44                clientThread.Start(client);
45            }
46        }
47        catch (ThreadInterruptedException)
48        {
49        }
50
51        tcpListener.Stop();
52        foreach(var client in connectedClients)
53            client.Value.Close();
54    }
55   
56    public void SendJob(JobInput j, EndPoint i)
57    {
58        TcpClient client = null;
59        lock(connectedClients)
60        {
61            if(!connectedClients.TryGetValue(i, out client))
62                throw new ArgumentException("Not connected to "+i);
63        }
64
65        lock(client)
66        {
67            var wrapped = new PlatformIndependentWrapper(client);
68
69            wrapped.WriteInt((int)ServerOpcodes.NEW_JOB);
70            wrapped.WriteString(j.Guid);
71            wrapped.WriteString(j.Src);
72            wrapped.WriteInt(j.Key.Length);
73            wrapped.WriteBytes(j.Key);
74            wrapped.WriteInt(j.LargerThen ? 1 : 0);
75            wrapped.WriteInt(j.Size);
76            wrapped.WriteInt(j.ResultSize);
77        }
78    }
79
80    private void HandleClient(object obj)
81    {
82        var client = obj as TcpClient;
83        EndPoint ep = client.Client.RemoteEndPoint;
84
85        try
86        {
87            var wrapped = new PlatformIndependentWrapper(client);
88            while(true)
89            {
90                switch((ClientOpcodes)wrapped.ReadInt())
91                {
92                    case ClientOpcodes.HELLO:
93                        {
94                            String identification = wrapped.ReadString();
95                            if(OnClientConnected != null)
96                                OnClientConnected(ep, identification);
97                        }
98                        break;
99
100                    case ClientOpcodes.JOB_RESULT:
101                        {
102                            var jobGuid = wrapped.ReadString();
103                            var resultList = new List<KeyValuePair<float, int>>();
104                            var resultListLength = wrapped.ReadInt();
105                            for (int c = 0; c < resultListLength; c++)
106                            {
107                                var key = wrapped.ReadInt();
108                                var cost = wrapped.ReadFloat();
109                                resultList.Add(new KeyValuePair<float, int>(cost, key));
110                            }
111
112                            JobResult rs = new JobResult();
113                            rs.Guid = jobGuid;
114                            rs.ResultList = resultList;
115
116                            if(OnJobCompleted != null)
117                            {
118                                OnJobCompleted(ep, rs);
119                            }
120                        }
121                        break;
122                }
123            }
124        }
125        catch(Exception e)
126        {
127            Console.WriteLine("Client exited with exception "+e);
128        }
129
130        lock(connectedClients)
131        {
132            connectedClients.Remove(ep);
133        }
134
135        if(OnClientDisconnected != null)
136            OnClientDisconnected(ep);
137    }
138
139}
Note: See TracBrowser for help on using the repository browser.