-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.cpp
93 lines (92 loc) · 3.24 KB
/
client.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
#ifdef TCPSERVER
#include "tcpServer.h"
#else
#include "udpServer.h"
#endif
#include "clientConnectionManager.h"
#include "config.h"
int main() {
#if defined(_WIN32) || defined(_WIN64)
config::instance().init("./config/client_windows.json");
#else
config::instance().init("./config/client_linux.json");
#endif
std::string remoteIP=config::instance().json["remoteIP"].toString();
int remotePort=config::instance().json["remotePort"].toInt();
int remoteProxyPort=config::instance().json["remoteProxyPort"].toInt();
#if defined(_WIN32) || defined(_WIN64)
WSADATA wsaData = {0};
int nRet = 0;
if(SOCKET_ERROR == WSAStartup(MAKEWORD(2,2), &wsaData))
{
std::cerr << "fail to WSAStartUp"<<std::endl;
return -1;
}
#endif
safeQueue<std::promise<int>> connections;
bool quit=false;
std::thread manageThread([&](){
clientConnectionManager manager(remoteIP,remotePort);
manager.doManage(config::instance().json["password"].toString(),connections,&quit);
});
std::string forwardIP=config::instance().json["forwardIP"].toString();;
int forwardPort=config::instance().json["forwardPort"].toInt();;
std::thread proxyThread([&](){
#ifdef TCPSERVER
tcpServer server;
server.doProxy(connections,tcpServer::CLIENT,&forwardPort,&forwardIP);
#else
udpServer server;
server.doProxy(connections,udpServer::CLIENT,&forwardPort,&forwardIP);
#endif
});
while (true) {
char buf[256];
std::cin.getline(buf,256);
std::string command(buf);
std::string _quit="quit";
if (command.substr(0,_quit.length())==_quit) {
std::cout<<"logout..."<<std::endl;
quit=true;
#ifdef TCPSERVER
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);//向真实端口发起连接
sockaddr_in servaddr;
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(remoteProxyPort);
#if defined(_WIN32) || defined(_WIN64)
servaddr.sin_addr.S_un.S_addr = inet_addr(remoteIP.c_str());
#else
inet_pton(AF_INET, remoteIP.c_str(), &servaddr.sin_addr);
#endif
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
std::cerr<<"connect error at:"<<__FILE__<<",line"<<__LINE__<<std::endl;;
}
#if defined(_WIN32) || defined(_WIN64)
closesocket(sockfd);
#else
close(sockfd);
#endif
}
#else
int sockfd=socket(PF_INET, SOCK_DGRAM, 0);//向真实端口发起连接
sockaddr_in servaddr;
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(remoteProxyPort);
inet_pton(AF_INET, remoteIP.c_str(), &servaddr.sin_addr);
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
std::cerr<<"connect error"<<std::endl;
}
write(sockfd,"\n",1);
close(sockfd);
#endif
manageThread.join();
std::cout<<"done"<<std::endl;
break;
}
}
}