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

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

Improved external client:

  • added possibility to choose device
  • added verbose device information
  • added device name to identification
  • misc cleanup
File size: 4.1 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    char buf[255];
28    if(!gethostname(buf, sizeof(buf)))
29    {
30        out << buf;
31    }
32    else
33    {
34        out << "unkhost";
35    }
36    out << "/";
37    const char* devicename = cryptool->getDeviceName().c_str();
38
39    const std::string whitespaces = " \t\r\n";
40
41    while(*devicename)
42    {
43        if(whitespaces.find(*devicename) == std::string::npos)
44        {
45            out << *devicename;
46        }
47        ++devicename;
48    }
49    return out.str();
50}
51
52
53void writeJobResult(PlatformIndependentWrapper& wrapper, JobResult& result)
54{
55    wrapper.WriteInt(ClientOpcodes::JOB_RESULT);
56    wrapper.WriteString(result.Guid);
57    wrapper.WriteInt(result.ResultList.size());
58    for (std::list<std::pair<float, int> >::iterator it = result.ResultList.begin(); it != result.ResultList.end(); ++it)
59    {
60        wrapper.WriteInt(it->second);
61        wrapper.WriteFloat(it->first);
62    }
63}
64
65// Queue of completed jobs
66std::queue<JobResult> finishedJobs;
67void GetJobsAndPostResults(PlatformIndependentWrapper& wrapper, const char* password)
68{
69    if (cryptool == 0)
70        cryptool = new Cryptool();
71
72    wrapper.WriteInt(ClientOpcodes::HELLO);
73    wrapper.WriteString(getIdentificationStr());
74    wrapper.WriteString(password);
75
76    while(!finishedJobs.empty())
77    {
78        printf("Trying to send %u finished job%s\n", finishedJobs.size(), finishedJobs.size()>1?"s":"");
79        writeJobResult(wrapper, finishedJobs.front());
80        finishedJobs.pop();
81    }
82    // loop will be escaped by wrapper exceptions
83    while(true)
84    {
85        // TODO: soft break
86        printf("Requesting new job...\n");
87        wrapper.WriteInt(ClientOpcodes::JOB_REQUEST);
88        switch(wrapper.ReadInt())
89        {
90            case ServerOpcodes::NEW_JOB:
91                {
92                    Job j;
93                    j.Guid = wrapper.ReadString();
94                    j.Src = wrapper.ReadString();
95                    j.KeySize = wrapper.ReadInt();
96                    j.Key = new char[j.KeySize];
97                    wrapper.ReadArray(j.Key, j.KeySize);
98                    j.LargerThen = (wrapper.ReadInt() ? true : false);
99                    j.Size = wrapper.ReadInt();
100                    j.ResultSize = wrapper.ReadInt();
101                    printf("Got new job! guid=%s\n", j.Guid.c_str());
102
103                    JobResult res = cryptool->doOpenCLJob(j);
104                    //send results back:
105                    try {
106                        writeJobResult(wrapper, res);
107                    }catch(SocketException e)
108                    {
109                        printf("Exception while writing results :(\n");
110                        finishedJobs.push(res);
111                        throw e;
112                    }
113                }
114                break;
115            case ServerOpcodes::WRONG_PASSWORD:
116                printf("Server didn't accept our password :(\n");
117                break;
118        }
119    }
120}
121
122void networkThread(sockaddr_in serv_addr, int port, const char* password)
123{
124    printf("Connecting to %s on port %i\n", inet_ntoa(serv_addr.sin_addr), port);
125    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
126
127    if (sockfd < 0) 
128    {
129        printf("  ERROR opening socket\n");
130        return;
131    }
132
133    if (connect(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
134    {
135        printf("  Couldn't connect\n");
136        close(sockfd);
137        return;
138    }
139    printf("  Connection established\n");
140   
141    // set read timeout
142    struct timeval tv;
143    tv.tv_sec = 2*60;
144    tv.tv_usec = 0;
145    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
146
147    try{
148        PlatformIndependentWrapper w(sockfd);
149        GetJobsAndPostResults(w, password);
150    } catch(SocketException)
151    {
152        close(sockfd);
153        return;
154    }
155}
156
Note: See TracBrowser for help on using the repository browser.