forked from psychocrypt/xmr-pool-mock
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
130 lines (104 loc) · 3.26 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "socks.h"
using namespace std;
char motd[2048] = {0};
SOCKET cli_sck;
bool process_line(size_t& n, char* line, size_t lnlen)
{
char buffer[1024];
const char* rsp;
const char* fmt;
switch(n)
{
case 0:
fmt = "{\"id\":0,\"jsonrpc\":\"2.0\",\"error\":null,\"result\":{\"id\":\"decafbad0\",\"job\":{\"blob\":\"0000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"job_id\":\"00000000\",\"target\":\"ffff3f00\",\"motd\":\"%s\"},"
"\"extensions\":[\"backend\",\"hashcount\",\"algo\",\"motd\"],\"status\":\"OK\"}}\n";
snprintf(buffer, sizeof(buffer), fmt, motd);
rsp = buffer;
break;
default:
rsp = "{\"id\":1,\"jsonrpc\":\"2.0\",\"error\":null,\"result\":{\"status\":\"OK\"}}\n";
break;
}
n++;
send(cli_sck, rsp, strlen(rsp), 0);
line[lnlen] = '\0';
printf("RECV %s\nSEND %s\n", line, rsp);
return true;
}
inline char hf_bin2hex(unsigned char c)
{
if (c <= 0x9)
return '0' + c;
else
return 'a' - 0xA + c;
}
void bin2hex(const unsigned char* in, unsigned int len, char* out)
{
for (unsigned int i = 0; i < len; i++)
{
out[i * 2] = hf_bin2hex((in[i] & 0xF0) >> 4);
out[i * 2 + 1] = hf_bin2hex(in[i] & 0x0F);
}
}
int main(int argc, char** argv)
{
if(argc != 3)
return 0;
bin2hex((const unsigned char*)argv[2], strlen(argv[2]), motd);
sockaddr_in my_addr;
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(s == INVALID_SOCKET)
return false;
int enable = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0)
fputs("setsockopt(SO_REUSEADDR) failed\n", stderr);
/*enable = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(int)) < 0)
fputs("setsockopt(SO_REUSEPORT) failed\n", stderr);*/
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_port = htons(atoi(argv[1]));
if(bind(s, (sockaddr*) &my_addr, sizeof(my_addr)) < 0)
return false;
if(listen(s, SOMAXCONN) < 0)
return false;
while(true)
{
socklen_t ln = sizeof(sockaddr_in);
cli_sck = accept(s, nullptr, &ln);
char buf[2048];
size_t datalen = 0;
int ret;
size_t n = 0;
while (true)
{
ret = recv(cli_sck, buf + datalen, sizeof(buf) - datalen, 0);
if(ret == 0)
break;
if(ret == SOCKET_ERROR || ret < 0)
break;
datalen += ret;
if (datalen >= sizeof(buf))
break;
char* lnend;
char* lnstart = buf;
while ((lnend = (char*)memchr(lnstart, '\n', datalen)) != nullptr)
{
lnend++;
int lnlen = lnend - lnstart;
if (!process_line(n, lnstart, lnlen))
break;
datalen -= lnlen;
lnstart = lnend;
}
//Got leftover data? Move it to the front
if (datalen > 0 && buf != lnstart)
memmove(buf, lnstart, datalen);
}
}
}