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

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

External client: added timeout for blocking read calls

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