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

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

Added code for using keysearcher with external client.

External client not available yet.

File size: 4.1 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        var tcpListener = new TcpListener(IPAddress.Any, Port);
30        tcpListener.Start();
31        Console.WriteLine("Listening for client on port "+Port);
32        while(true)
33        {
34            TcpClient client = tcpListener.AcceptTcpClient();
35            Console.WriteLine("Got connection from "+client);
36            lock(connectedClients)
37            {
38                connectedClients.Add(client.Client.RemoteEndPoint, client);
39            }
40            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
41            clientThread.Start(client);
42        }
43    }
44
45
46    public void SendJob(JobInput j, EndPoint i)
47    {
48        TcpClient client = null;
49        lock(connectedClients)
50        {
51            if(!connectedClients.TryGetValue(i, out client))
52                throw new ArgumentException("Not connected to "+i);
53        }
54
55        lock(client)
56        {
57            var wrapped = new PlatformIndependentWrapper(client);
58
59            wrapped.WriteInt((int)ServerOpcodes.NEW_JOB);
60            wrapped.WriteString(j.Guid);
61            wrapped.WriteString(j.Src);
62            wrapped.WriteBytes(j.Key);
63            wrapped.WriteInt(j.LargerThen ? 1 : 0);
64            wrapped.WriteInt(j.Size);
65            wrapped.WriteInt(j.ResultSize);
66        }
67    }
68
69    private void HandleClient(object obj)
70    {
71        var client = obj as TcpClient;
72        EndPoint ep = client.Client.RemoteEndPoint;
73
74        try
75        {
76            var wrapped = new PlatformIndependentWrapper(client);
77            while(true)
78            {
79                switch((ClientOpcodes)wrapped.ReadInt())
80                {
81                    case ClientOpcodes.HELLO:
82                        {
83                            String identification = wrapped.ReadString();
84                            if(OnClientConnected != null)
85                                OnClientConnected(ep, identification);
86                        }
87                        break;
88
89                    case ClientOpcodes.JOB_RESULT:
90                        {
91                            var jobGuid = wrapped.ReadString();
92                            var resultList = new SortedDictionary<float, int>();
93                            var resultListLength = wrapped.ReadInt();
94                            for (int c = 0; c < resultListLength; c++)
95                            {
96                                var key = wrapped.ReadInt();
97                                var cost = wrapped.ReadFloat();
98                                resultList.Add(cost, key);
99                            }
100
101                            JobResult rs = new JobResult();
102                            rs.Guid = jobGuid;
103                            rs.ResultList = resultList;
104
105                            if(OnJobCompleted != null)
106                            {
107                                OnJobCompleted(ep, rs);
108                            }
109                        }
110                        break;
111                }
112            }
113        }
114        catch(Exception e)
115        {
116            Console.WriteLine("Client exited with exception "+e);
117        }
118
119        lock(connectedClients)
120        {
121            connectedClients.Remove(ep);
122        }
123
124        if(OnClientDisconnected != null)
125            OnClientDisconnected(ep);
126    }
127
128}
Note: See TracBrowser for help on using the repository browser.