Spaces:
Paused
Paused
xukc
commited on
Commit
·
c8aad12
1
Parent(s):
57ff546
[fix]tcp runtime error
Browse files- .vscode/launch.json +1 -1
- main.cpp +34 -25
- src/tcp_client.cpp +17 -4
- src/tcp_inbound.cpp +2 -2
- src/udp_client.cpp +8 -8
- src/udp_inbound.cpp +2 -0
.vscode/launch.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
"type": "cppdbg",
|
7 |
"request": "launch",
|
8 |
"program": "${workspaceFolder}/proxyServer",
|
9 |
-
"args": ["0", "
|
10 |
"stopAtEntry": false,
|
11 |
"cwd": "${workspaceFolder}",
|
12 |
"environment": [],
|
|
|
6 |
"type": "cppdbg",
|
7 |
"request": "launch",
|
8 |
"program": "${workspaceFolder}/proxyServer",
|
9 |
+
"args": ["0", "8000"],
|
10 |
"stopAtEntry": false,
|
11 |
"cwd": "${workspaceFolder}",
|
12 |
"environment": [],
|
main.cpp
CHANGED
@@ -17,23 +17,25 @@
|
|
17 |
#include "spdlog/async.h"
|
18 |
#include "spdlog/sinks/stdout_color_sinks.h"
|
19 |
|
20 |
-
static const char*
|
21 |
static int port = 8080;
|
22 |
static int thread_num = 4;
|
23 |
static hloop_t *tcpaccept_loop = NULL, *udpbind_loop = NULL;
|
24 |
|
25 |
-
static void new_conn_event(hevent_t*
|
26 |
-
|
27 |
-
|
|
|
28 |
hio_attach(loop, io);
|
29 |
|
30 |
tcp_on_accept(io, ev);
|
31 |
}
|
32 |
|
33 |
-
static void on_accept(hio_t*
|
|
|
34 |
hio_detach(io);
|
35 |
|
36 |
-
hloop_t*
|
37 |
hevent_t ev;
|
38 |
memset(&ev, 0, sizeof(ev));
|
39 |
ev.loop = worker_loop;
|
@@ -42,16 +44,19 @@ static void on_accept(hio_t* io) {
|
|
42 |
hloop_post_event(worker_loop, &ev);
|
43 |
}
|
44 |
|
45 |
-
static HTHREAD_RETTYPE worker_thread(void*
|
46 |
-
|
|
|
47 |
hloop_run(loop);
|
48 |
return 0;
|
49 |
}
|
50 |
|
51 |
-
static HTHREAD_RETTYPE tcpaccept_thread(void*
|
52 |
-
|
53 |
-
|
54 |
-
|
|
|
|
|
55 |
exit(1);
|
56 |
}
|
57 |
int listeniofd = hio_fd(listenio);
|
@@ -60,10 +65,12 @@ static HTHREAD_RETTYPE tcpaccept_thread(void* userdata) {
|
|
60 |
return 0;
|
61 |
}
|
62 |
|
63 |
-
static HTHREAD_RETTYPE udpbind_thread(void*
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
|
|
67 |
exit(1);
|
68 |
}
|
69 |
int bindfd = hio_fd(bindio);
|
@@ -77,17 +84,20 @@ static HTHREAD_RETTYPE udpbind_thread(void* userdata) {
|
|
77 |
return 0;
|
78 |
}
|
79 |
|
80 |
-
int main(int argc, char**
|
|
|
81 |
int type = 0;
|
82 |
-
if (argc == 3)
|
|
|
83 |
type = atoi(argv[1]);
|
84 |
port = atoi(argv[2]);
|
85 |
}
|
86 |
int cores = std::thread::hardware_concurrency();
|
87 |
-
if (cores > 0)
|
|
|
88 |
thread_num = cores;
|
89 |
}
|
90 |
-
|
91 |
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
92 |
auto logger = std::make_shared<spdlog::logger>("my_logger", console_sink);
|
93 |
|
@@ -98,24 +108,23 @@ int main(int argc, char** argv) {
|
|
98 |
spdlog::set_default_logger(std::make_shared<spdlog::async_logger>(
|
99 |
"ProxyServer", console_sink, spdlog::thread_pool(), spdlog::async_overflow_policy::block));
|
100 |
|
101 |
-
|
102 |
spdlog::info("ProxyServer start: threadNum:{:d}", thread_num);
|
103 |
|
104 |
if (type == 1)
|
105 |
{
|
106 |
-
|
107 |
spdlog::info("ProxyServer start: udp->{}", port);
|
108 |
udpbind_loop = hloop_new(HLOOP_FLAG_AUTO_FREE);
|
109 |
udpbind_thread(udpbind_loop);
|
110 |
}
|
111 |
-
else
|
112 |
-
|
|
|
113 |
init_loop(thread_num, worker_thread);
|
114 |
spdlog::info("ProxyServer start: tcp->{}", port);
|
115 |
tcpaccept_loop = hloop_new(HLOOP_FLAG_AUTO_FREE);
|
116 |
tcpaccept_thread(tcpaccept_loop);
|
117 |
}
|
118 |
-
|
119 |
|
120 |
return 0;
|
121 |
}
|
|
|
17 |
#include "spdlog/async.h"
|
18 |
#include "spdlog/sinks/stdout_color_sinks.h"
|
19 |
|
20 |
+
static const char *host = "0.0.0.0";
|
21 |
static int port = 8080;
|
22 |
static int thread_num = 4;
|
23 |
static hloop_t *tcpaccept_loop = NULL, *udpbind_loop = NULL;
|
24 |
|
25 |
+
static void new_conn_event(hevent_t *ev)
|
26 |
+
{
|
27 |
+
hloop_t *loop = ev->loop;
|
28 |
+
hio_t *io = (hio_t *)hevent_userdata(ev);
|
29 |
hio_attach(loop, io);
|
30 |
|
31 |
tcp_on_accept(io, ev);
|
32 |
}
|
33 |
|
34 |
+
static void on_accept(hio_t *io)
|
35 |
+
{
|
36 |
hio_detach(io);
|
37 |
|
38 |
+
hloop_t *worker_loop = get_next_loop();
|
39 |
hevent_t ev;
|
40 |
memset(&ev, 0, sizeof(ev));
|
41 |
ev.loop = worker_loop;
|
|
|
44 |
hloop_post_event(worker_loop, &ev);
|
45 |
}
|
46 |
|
47 |
+
static HTHREAD_RETTYPE worker_thread(void *userdata)
|
48 |
+
{
|
49 |
+
hloop_t *loop = (hloop_t *)userdata;
|
50 |
hloop_run(loop);
|
51 |
return 0;
|
52 |
}
|
53 |
|
54 |
+
static HTHREAD_RETTYPE tcpaccept_thread(void *userdata)
|
55 |
+
{
|
56 |
+
hloop_t *loop = (hloop_t *)userdata;
|
57 |
+
hio_t *listenio = hloop_create_tcp_server(loop, host, port, on_accept);
|
58 |
+
if (listenio == NULL)
|
59 |
+
{
|
60 |
exit(1);
|
61 |
}
|
62 |
int listeniofd = hio_fd(listenio);
|
|
|
65 |
return 0;
|
66 |
}
|
67 |
|
68 |
+
static HTHREAD_RETTYPE udpbind_thread(void *userdata)
|
69 |
+
{
|
70 |
+
hloop_t *loop = (hloop_t *)userdata;
|
71 |
+
hio_t *bindio = hloop_create_udp_server(loop, host, port);
|
72 |
+
if (bindio == NULL)
|
73 |
+
{
|
74 |
exit(1);
|
75 |
}
|
76 |
int bindfd = hio_fd(bindio);
|
|
|
84 |
return 0;
|
85 |
}
|
86 |
|
87 |
+
int main(int argc, char **argv)
|
88 |
+
{
|
89 |
int type = 0;
|
90 |
+
if (argc == 3)
|
91 |
+
{
|
92 |
type = atoi(argv[1]);
|
93 |
port = atoi(argv[2]);
|
94 |
}
|
95 |
int cores = std::thread::hardware_concurrency();
|
96 |
+
if (cores > 0)
|
97 |
+
{
|
98 |
thread_num = cores;
|
99 |
}
|
100 |
+
|
101 |
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
102 |
auto logger = std::make_shared<spdlog::logger>("my_logger", console_sink);
|
103 |
|
|
|
108 |
spdlog::set_default_logger(std::make_shared<spdlog::async_logger>(
|
109 |
"ProxyServer", console_sink, spdlog::thread_pool(), spdlog::async_overflow_policy::block));
|
110 |
|
|
|
111 |
spdlog::info("ProxyServer start: threadNum:{:d}", thread_num);
|
112 |
|
113 |
if (type == 1)
|
114 |
{
|
115 |
+
// Udp
|
116 |
spdlog::info("ProxyServer start: udp->{}", port);
|
117 |
udpbind_loop = hloop_new(HLOOP_FLAG_AUTO_FREE);
|
118 |
udpbind_thread(udpbind_loop);
|
119 |
}
|
120 |
+
else
|
121 |
+
{
|
122 |
+
// Tcp
|
123 |
init_loop(thread_num, worker_thread);
|
124 |
spdlog::info("ProxyServer start: tcp->{}", port);
|
125 |
tcpaccept_loop = hloop_new(HLOOP_FLAG_AUTO_FREE);
|
126 |
tcpaccept_thread(tcpaccept_loop);
|
127 |
}
|
|
|
128 |
|
129 |
return 0;
|
130 |
}
|
src/tcp_client.cpp
CHANGED
@@ -14,7 +14,8 @@ void TcpClientBolt::onConnection(const hv::SocketChannelPtr &channel)
|
|
14 |
int len = sizeof(buff);
|
15 |
|
16 |
PACK_TUNNEL_DATA(boltdata, boltdata_len, BOLT_VERSION, BOLT_RESERVE, BOLT_PAYLOAD_TYPE_CMD, t_addr.sin_addr.s_addr, t_addr.sin_port, u_addr.sin_addr.s_addr, u_addr.sin_port, session_id, 0, 0, buff, len);
|
17 |
-
hio_write(io,
|
|
|
18 |
}
|
19 |
|
20 |
void TcpClientBolt::onRecv(const hv::SocketChannelPtr &channel, hv::Buffer *buf)
|
@@ -34,22 +35,28 @@ void TcpClientBolt::onRecv(const hv::SocketChannelPtr &channel, hv::Buffer *buf)
|
|
34 |
break;
|
35 |
}
|
36 |
}
|
|
|
37 |
}
|
|
|
38 |
|
39 |
-
hio_write(io, buf->data(), buf->size());
|
40 |
}
|
41 |
|
42 |
void TcpClientBolt::onWrited(const hv::SocketChannelPtr &channel, hv::Buffer *buf)
|
43 |
{
|
44 |
if (channel.get()->isWriteComplete())
|
45 |
{
|
46 |
-
|
47 |
}
|
48 |
|
49 |
}
|
50 |
|
51 |
void TcpClientBolt::onDisConnection(const hv::SocketChannelPtr &channel)
|
52 |
{
|
|
|
|
|
|
|
|
|
|
|
53 |
hio_close(io);
|
54 |
}
|
55 |
|
@@ -64,8 +71,10 @@ bool TcpClientBolt::handShake(void *buf, int readbytes)
|
|
64 |
{
|
65 |
if (dest_len == 1 && dest[0] == BOLT_CHANNEL_CMD_TCP_HANDSHAKE_REQUEST)
|
66 |
{
|
|
|
67 |
this->t_addr.sin_addr.s_addr = t_ip;
|
68 |
this->t_addr.sin_port = t_port;
|
|
|
69 |
this->u_addr.sin_addr.s_addr = u_ip;
|
70 |
this->u_addr.sin_port = u_port;
|
71 |
this->session_id = session_id;
|
@@ -83,6 +92,7 @@ bool TcpClientBolt::handShake(void *buf, int readbytes)
|
|
83 |
|
84 |
if (!this->connect((struct sockaddr *)&t_addr))
|
85 |
{
|
|
|
86 |
char buff[2];
|
87 |
buff[0] = BOLT_CHANNEL_CMD_TCP_HANDSHAKE_RESPONSE;
|
88 |
buff[1] = BOLT_TCP_HANDSHAKE_FAIL_TIMEOUT;
|
@@ -114,9 +124,11 @@ bool TcpClientBolt::handShake(void *buf, int readbytes)
|
|
114 |
config.ept_type = config.encrypt ? CRYPT_TYPE::XOR : CRYPT_TYPE::NONE;
|
115 |
config.ept_key = config.encrypt ? generateRandomKey() : 0;
|
116 |
|
|
|
|
|
117 |
GENERATE_DECRYPT_KEY(extend_response, extend_response_len, config.ept_type, config.ept_key)
|
118 |
|
119 |
-
|
120 |
|
121 |
PACK_BIND_RESPONSE_DATA(bind_response, bind_response_len, BOLT_CHANNEL_CMD_BIND_RESPONSE, request_id, session_id, result)
|
122 |
|
@@ -133,6 +145,7 @@ bool TcpClientBolt::handShake(void *buf, int readbytes)
|
|
133 |
TcpClientMap<uint32_t, tcpBoltConfig>::getInstance().remove(session_id);
|
134 |
this->close();
|
135 |
hio_close_async(io);
|
|
|
136 |
}
|
137 |
}
|
138 |
}
|
|
|
14 |
int len = sizeof(buff);
|
15 |
|
16 |
PACK_TUNNEL_DATA(boltdata, boltdata_len, BOLT_VERSION, BOLT_RESERVE, BOLT_PAYLOAD_TYPE_CMD, t_addr.sin_addr.s_addr, t_addr.sin_port, u_addr.sin_addr.s_addr, u_addr.sin_port, session_id, 0, 0, buff, len);
|
17 |
+
hio_write(io, boltdata, boltdata_len);
|
18 |
+
spdlog::info("BOLT_CHANNEL_CMD_TCP_HANDSHAKE_REQUEST: t_addr={}:{}, u_addr={}:{} ==> connect succ", inet_ntoa(t_addr.sin_addr), htons(t_addr.sin_port), inet_ntoa(u_addr.sin_addr), htons(u_addr.sin_port));
|
19 |
}
|
20 |
|
21 |
void TcpClientBolt::onRecv(const hv::SocketChannelPtr &channel, hv::Buffer *buf)
|
|
|
35 |
break;
|
36 |
}
|
37 |
}
|
38 |
+
hio_write(io, buf->data(), buf->size());
|
39 |
}
|
40 |
+
spdlog::info("t_addr={}:{}, u_addr={}:{} onRecv==> {}={}", inet_ntoa(t_addr.sin_addr), htons(t_addr.sin_port), inet_ntoa(u_addr.sin_addr), htons(u_addr.sin_port), buf->len, (const char*)buf->data());
|
41 |
|
|
|
42 |
}
|
43 |
|
44 |
void TcpClientBolt::onWrited(const hv::SocketChannelPtr &channel, hv::Buffer *buf)
|
45 |
{
|
46 |
if (channel.get()->isWriteComplete())
|
47 |
{
|
48 |
+
spdlog::info("t_addr={}:{}, u_addr={}:{} isWriteComplete==> {}={}", inet_ntoa(t_addr.sin_addr), htons(t_addr.sin_port), inet_ntoa(u_addr.sin_addr), htons(u_addr.sin_port), buf->len, (const char*)buf->data());
|
49 |
}
|
50 |
|
51 |
}
|
52 |
|
53 |
void TcpClientBolt::onDisConnection(const hv::SocketChannelPtr &channel)
|
54 |
{
|
55 |
+
if (is_bolt_server)
|
56 |
+
{
|
57 |
+
TcpClientMap<uint32_t, tcpBoltConfig>::getInstance().remove(session_id);
|
58 |
+
}
|
59 |
+
|
60 |
hio_close(io);
|
61 |
}
|
62 |
|
|
|
71 |
{
|
72 |
if (dest_len == 1 && dest[0] == BOLT_CHANNEL_CMD_TCP_HANDSHAKE_REQUEST)
|
73 |
{
|
74 |
+
this->t_addr.sin_family = AF_INET;
|
75 |
this->t_addr.sin_addr.s_addr = t_ip;
|
76 |
this->t_addr.sin_port = t_port;
|
77 |
+
this->u_addr.sin_family = AF_INET;
|
78 |
this->u_addr.sin_addr.s_addr = u_ip;
|
79 |
this->u_addr.sin_port = u_port;
|
80 |
this->session_id = session_id;
|
|
|
92 |
|
93 |
if (!this->connect((struct sockaddr *)&t_addr))
|
94 |
{
|
95 |
+
spdlog::info("BOLT_CHANNEL_CMD_TCP_HANDSHAKE_REQUEST: t_addr={}:{}, u_addr={}:{} ==> connect fail", inet_ntoa(t_addr.sin_addr), htons(t_addr.sin_port), inet_ntoa(u_addr.sin_addr), htons(u_addr.sin_port));
|
96 |
char buff[2];
|
97 |
buff[0] = BOLT_CHANNEL_CMD_TCP_HANDSHAKE_RESPONSE;
|
98 |
buff[1] = BOLT_TCP_HANDSHAKE_FAIL_TIMEOUT;
|
|
|
124 |
config.ept_type = config.encrypt ? CRYPT_TYPE::XOR : CRYPT_TYPE::NONE;
|
125 |
config.ept_key = config.encrypt ? generateRandomKey() : 0;
|
126 |
|
127 |
+
spdlog::info("BOLT_CHANNEL_CMD_BIND_REQUEST: requestId:{}, session_id:{}, encrypt:{}", request_id, session_id, config.encrypt);
|
128 |
+
|
129 |
GENERATE_DECRYPT_KEY(extend_response, extend_response_len, config.ept_type, config.ept_key)
|
130 |
|
131 |
+
uint32_t result = BOLT_BIND_RESPONSE_CODE_SUCESS;
|
132 |
|
133 |
PACK_BIND_RESPONSE_DATA(bind_response, bind_response_len, BOLT_CHANNEL_CMD_BIND_RESPONSE, request_id, session_id, result)
|
134 |
|
|
|
145 |
TcpClientMap<uint32_t, tcpBoltConfig>::getInstance().remove(session_id);
|
146 |
this->close();
|
147 |
hio_close_async(io);
|
148 |
+
spdlog::info("BOLT_CHANNEL_CMD_UNBIND_REQUEST: t_addr={}:{}, u_addr={}:{}", inet_ntoa(t_addr.sin_addr), htons(t_addr.sin_port), inet_ntoa(u_addr.sin_addr), htons(u_addr.sin_port));
|
149 |
}
|
150 |
}
|
151 |
}
|
src/tcp_inbound.cpp
CHANGED
@@ -17,7 +17,7 @@ static void tcp_on_close(hio_t* io) {
|
|
17 |
}
|
18 |
|
19 |
static void tcp_on_recv(hio_t* io, void* buf, int readbytes) {
|
20 |
-
spdlog::info("tcp_on_recv fd={} buf({})={}
|
21 |
auto cli = TcpConnMap<hio_t*, TcpClientBolt>::getInstance().get(io);
|
22 |
if(cli) {
|
23 |
if (cli->hasHandshake())
|
@@ -27,7 +27,7 @@ static void tcp_on_recv(hio_t* io, void* buf, int readbytes) {
|
|
27 |
cli->handShake(buf, readbytes);
|
28 |
}
|
29 |
|
30 |
-
}
|
31 |
}
|
32 |
|
33 |
void tcp_on_accept(hio_t* io, hevent_t* ev) {
|
|
|
17 |
}
|
18 |
|
19 |
static void tcp_on_recv(hio_t* io, void* buf, int readbytes) {
|
20 |
+
spdlog::info("tcp_on_recv fd={} buf({})={}", hio_fd(io), readbytes, (const char*)buf);
|
21 |
auto cli = TcpConnMap<hio_t*, TcpClientBolt>::getInstance().get(io);
|
22 |
if(cli) {
|
23 |
if (cli->hasHandshake())
|
|
|
27 |
cli->handShake(buf, readbytes);
|
28 |
}
|
29 |
|
30 |
+
}
|
31 |
}
|
32 |
|
33 |
void tcp_on_accept(hio_t* io, hevent_t* ev) {
|
src/udp_client.cpp
CHANGED
@@ -30,10 +30,10 @@ bool UdpServerBoltProxy::analyzeData(struct sockaddr_in t_addr, struct sockaddr_
|
|
30 |
client = new_client.get();
|
31 |
}
|
32 |
|
33 |
-
if (getConfig().ept_type == CRYPT_TYPE::XOR)
|
34 |
-
{
|
35 |
-
|
36 |
-
}
|
37 |
|
38 |
client->getClient()->sendto(dest, dest_len);
|
39 |
|
@@ -43,10 +43,10 @@ bool UdpServerBoltProxy::analyzeData(struct sockaddr_in t_addr, struct sockaddr_
|
|
43 |
int UdpServerBoltProxy::sendData(struct sockaddr_in t_addr, struct sockaddr_in u_addr, void *data, int data_len)
|
44 |
{
|
45 |
|
46 |
-
if (getConfig().ept_type == CRYPT_TYPE::XOR)
|
47 |
-
{
|
48 |
-
|
49 |
-
}
|
50 |
PACK_TUNNEL_DATA(boltdata, boltdata_len, BOLT_VERSION, BOLT_RESERVE, BOLT_PAYLOAD_TYPE_UDP, t_addr.sin_addr.s_addr, t_addr.sin_port, u_addr.sin_addr.s_addr, u_addr.sin_port, config.session_id, 0, 0, data, data_len)
|
51 |
return hio_write(io, boltdata, boltdata_len);
|
52 |
|
|
|
30 |
client = new_client.get();
|
31 |
}
|
32 |
|
33 |
+
// if (getConfig().ept_type == CRYPT_TYPE::XOR)
|
34 |
+
// {
|
35 |
+
// xor_::crypt((char *)dest, dest_len, getConfig().ept_key);
|
36 |
+
// }
|
37 |
|
38 |
client->getClient()->sendto(dest, dest_len);
|
39 |
|
|
|
43 |
int UdpServerBoltProxy::sendData(struct sockaddr_in t_addr, struct sockaddr_in u_addr, void *data, int data_len)
|
44 |
{
|
45 |
|
46 |
+
// if (getConfig().ept_type == CRYPT_TYPE::XOR)
|
47 |
+
// {
|
48 |
+
// xor_::crypt((char *)data, data_len, getConfig().ept_key);
|
49 |
+
// }
|
50 |
PACK_TUNNEL_DATA(boltdata, boltdata_len, BOLT_VERSION, BOLT_RESERVE, BOLT_PAYLOAD_TYPE_UDP, t_addr.sin_addr.s_addr, t_addr.sin_port, u_addr.sin_addr.s_addr, u_addr.sin_port, config.session_id, 0, 0, data, data_len)
|
51 |
return hio_write(io, boltdata, boltdata_len);
|
52 |
|
src/udp_inbound.cpp
CHANGED
@@ -62,8 +62,10 @@ void udp_on_recvfrom(hio_t *io, void *buf, int readbytes)
|
|
62 |
|
63 |
auto serverProxy = UdpConnMap<uint32_t, UdpServerBoltProxy>::getInstance().get(session_id);
|
64 |
struct sockaddr_in t_addr = {0}, u_addr = {0};
|
|
|
65 |
t_addr.sin_addr.s_addr = t_ip;
|
66 |
t_addr.sin_port = t_port;
|
|
|
67 |
u_addr.sin_addr.s_addr = u_ip;
|
68 |
u_addr.sin_port = u_port;
|
69 |
if (serverProxy && serverProxy->analyzeData(t_addr, u_addr, session_id, dest, dest_len, extend, extend_len))
|
|
|
62 |
|
63 |
auto serverProxy = UdpConnMap<uint32_t, UdpServerBoltProxy>::getInstance().get(session_id);
|
64 |
struct sockaddr_in t_addr = {0}, u_addr = {0};
|
65 |
+
t_addr.sin_family = AF_INET;
|
66 |
t_addr.sin_addr.s_addr = t_ip;
|
67 |
t_addr.sin_port = t_port;
|
68 |
+
u_addr.sin_family = AF_INET;
|
69 |
u_addr.sin_addr.s_addr = u_ip;
|
70 |
u_addr.sin_port = u_port;
|
71 |
if (serverProxy && serverProxy->analyzeData(t_addr, u_addr, session_id, dest, dest_len, extend, extend_len))
|