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

Last change on this file was 8983, checked in by kopal, 9 months ago

Complete CrypTool 2 project

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