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

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

KeySearcher codeformatting stuff

File size: 4.3 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.WriteInt(j.Key.Length);
63            wrapped.WriteBytes(j.Key);
64            wrapped.WriteInt(j.LargerThen ? 1 : 0);
65            wrapped.WriteInt(j.Size);
66            wrapped.WriteInt(j.ResultSize);
67        }
68    }
69
70    private void HandleClient(object obj)
71    {
72        var client = obj as TcpClient;
73        EndPoint ep = client.Client.RemoteEndPoint;
74
75        try
76        {
77            var wrapped = new PlatformIndependentWrapper(client);
78            while(true)
79            {
80                switch((ClientOpcodes)wrapped.ReadInt())
81                {
82                    case ClientOpcodes.HELLO:
83                        {
84                            String identification = wrapped.ReadString();
85                            if(OnClientConnected != null)
86                                OnClientConnected(ep, identification);
87                        }
88                        break;
89
90                    case ClientOpcodes.JOB_RESULT:
91                        {
92                            var jobGuid = wrapped.ReadString();
93                            var resultList = new SortedDictionary<float, int>();
94                            var resultListLength = wrapped.ReadInt();
95                            for (int c = 0; c < resultListLength; c++)
96                            {
97                                var key = wrapped.ReadInt();
98                                var cost = wrapped.ReadFloat();
99                                resultList.Add(cost, key);
100                            }
101
102                            JobResult rs = new JobResult();
103                            rs.Guid = jobGuid;
104                            rs.ResultList = resultList;
105
106                            if(OnJobCompleted != null)
107                            {
108                                OnJobCompleted(ep, rs);
109                            }
110                        }
111                        break;
112                }
113            }
114        }
115        catch(Exception e)
116        {
117            Console.WriteLine("Client exited with exception "+e);
118        }
119
120        lock(connectedClients)
121        {
122            connectedClients.Remove(ep);
123        }
124
125        if(OnClientDisconnected != null)
126            OnClientDisconnected(ep);
127    }
128
129}
Note: See TracBrowser for help on using the repository browser.