source: trunk/CrypPlugins/KeySearcher/ExternalClient/Network.cpp @ 2417

Last change on this file since 2417 was 2417, checked in by schwittmann, 11 years ago

Several ExternalClient improvements:

  • Separated connected and request job events
  • Added basic authentication
  • Lookup DNS again after getting disconnected
  • Fixed some socket exceptions
  • Prevent slow clients from submitting old jobs by using unique job identifiers
File size: 3.5 KB
Line 
1#include <ctype.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <sstream>
5#include <unistd.h>
6#include <sys/types.h>
7#include <arpa/inet.h>
8#include <sys/sysctl.h>
9#include <iostream>
10#include <queue>
11
12#include <sys/types.h>
13#include <sys/sysctl.h>
14
15
16
17#include "PlatformIndependentWrapper.h"
18#include "Opcodes.h"
19#include "Job.h"
20#include "Cryptool.h"
21
22Cryptool* cryptool = 0;
23
24std::string getIdentificationStr()
25{
26    std::stringstream out;
27    out << "cores:";
28    out << sysconf( _SC_NPROCESSORS_ONLN );
29    // todo: more
30    return out.str();
31}
32
33
34void writeJobResult(PlatformIndependentWrapper& wrapper, JobResult& result)
35{
36    wrapper.WriteInt(ClientOpcodes::JOB_RESULT);
37    wrapper.WriteString(result.Guid);
38    wrapper.WriteInt(result.ResultList.size());
39    for (std::list<std::pair<float, int> >::iterator it = result.ResultList.begin(); it != result.ResultList.end(); ++it)
40    {
41        wrapper.WriteInt(it->second);
42        wrapper.WriteFloat(it->first);
43    }
44}
45
46// Queue of completed jobs
47std::queue<JobResult> finishedJobs;
48void GetJobsAndPostResults(PlatformIndependentWrapper& wrapper, const char* password)
49{
50    if (cryptool == 0)
51        cryptool = new Cryptool();
52
53    wrapper.WriteInt(ClientOpcodes::HELLO);
54    wrapper.WriteString(getIdentificationStr());
55    wrapper.WriteString(password);
56
57    while(!finishedJobs.empty())
58    {
59        printf("Trying to send %u finished job%s\n", finishedJobs.size(), finishedJobs.size()>1?"s":"");
60        writeJobResult(wrapper, finishedJobs.front());
61        finishedJobs.pop();
62    }
63    // loop will be escaped by wrapper exceptions
64    while(true)
65    {
66        // TODO: soft break
67        wrapper.WriteInt(ClientOpcodes::JOB_REQUEST);
68        switch(wrapper.ReadInt())
69        {
70            case ServerOpcodes::NEW_JOB:
71                {
72                    Job j;
73                    j.Guid = wrapper.ReadString();
74                    j.Src = wrapper.ReadString();
75                    j.KeySize = wrapper.ReadInt();
76                    j.Key = new char[j.KeySize];
77                    wrapper.ReadArray(j.Key, j.KeySize);
78                    j.LargerThen = (wrapper.ReadInt() ? true : false);
79                    j.Size = wrapper.ReadInt();
80                    j.ResultSize = wrapper.ReadInt();
81                    printf("Got new job! guid=%s\n", j.Guid.c_str());
82
83                    JobResult res = cryptool->doOpenCLJob(j);
84                    //send results back:
85                    try {
86                        writeJobResult(wrapper, res);
87                    }catch(SocketException e)
88                    {
89                        printf("Exception while writing results :(\n");
90                        throw e;
91                    }
92                }
93                break;
94            case ServerOpcodes::WRONG_PASSWORD:
95                printf("Server didn't accept our password :(\n");
96                break;
97        }
98    }
99}
100
101void networkThread(sockaddr_in serv_addr, int port, const char* password)
102{
103    printf("Connecting to %s on port %i\n", inet_ntoa(serv_addr.sin_addr), port);
104    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
105
106    if (sockfd < 0) 
107    {
108        printf("  ERROR opening socket\n");
109        return;
110    }
111
112    if (connect(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
113    {
114        printf("  Couldn't connect\n");
115        close(sockfd);
116        return;
117    }
118    printf("  Connection established\n");
119
120    try{
121        PlatformIndependentWrapper w(sockfd);
122        GetJobsAndPostResults(w, password);
123    } catch(SocketException)
124    {
125        close(sockfd);
126        return;
127    }
128}
129
Note: See TracBrowser for help on using the repository browser.