aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar zfl9 <zfl9.com@gmail.com> 2019-08-31 17:19:03 +0800
committerGravatar zfl9 <zfl9.com@gmail.com> 2019-08-31 17:19:03 +0800
commit0f4e51eeb68895629c50f4a748e0424d627e3005 (patch)
treefa91bd61c0a03d24c8d3f51e8b5d344de11420a0
parentupdate dns2tcp (diff)
downloaddns2tcp-0f4e51eeb68895629c50f4a748e0424d627e3005.tar.gz
dns2tcp-0f4e51eeb68895629c50f4a748e0424d627e3005.tar.bz2
dns2tcp-0f4e51eeb68895629c50f4a748e0424d627e3005.zip
update dns2tcp
-rw-r--r--dns2tcp.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/dns2tcp.c b/dns2tcp.c
index bb8bab2..358cede 100644
--- a/dns2tcp.c
+++ b/dns2tcp.c
@@ -15,6 +15,7 @@
static bool g_verbose = false;
static uv_loop_t *g_evloop = NULL;
+static uv_udp_t *g_udp_server = NULL;
static char g_listen_ipstr[IP6STRLEN] = {0};
static portno_t g_listen_portno = 0;
static skaddr6_t g_listen_skaddr = {0};
@@ -25,6 +26,12 @@ static skaddr6_t g_remote_skaddr = {0};
static void udp_alloc_cb(uv_handle_t *udp_server, size_t sugsize, uv_buf_t *uvbuf);
static void udp_recv_cb(uv_udp_t *udp_server, ssize_t nread, const uv_buf_t *uvbuf, const skaddr_t *skaddr, unsigned flags);
+static void tcp_connect_cb(uv_connect_t *connreq, int status);
+static void tcp_write_cb(uv_write_t *writereq, int status);
+static void tcp_alloc_cb(uv_handle_t *tcp_client, size_t sugsize, uv_buf_t *uvbuf);
+static void tcp_read_cb(uv_stream_t *tcp_client, ssize_t nread, const uv_buf_t *uvbuf);
+static void tcp_close_cb(uv_handle_t *tcp_client);
+
static void print_command_help(void) {
printf("usage: dns2tcp <-L LISTEN_ADDR> <-R REMOTE_ADDR> [-vVh]\n"
" -L <ip#port> udp listen address, it is required\n"
@@ -154,16 +161,15 @@ int main(int argc, char *argv[]) {
IF_VERBOSE LOGINF("[main] verbose mode, affect performance");
g_evloop = uv_default_loop();
+ g_udp_server = &(uv_udp_t){0};
+ uv_udp_init(g_evloop, g_udp_server);
- uv_udp_t *udp_server = &(uv_udp_t){0};
- uv_udp_init(g_evloop, udp_server);
-
- int retval = uv_udp_bind(udp_server, (void *)&g_listen_skaddr, 0);
+ int retval = uv_udp_bind(g_udp_server, (void *)&g_listen_skaddr, 0);
if (retval < 0) {
LOGERR("[main] udp bind failed: (%d) %s", -retval, uv_strerror(retval));
return -retval;
}
- uv_udp_recv_start(udp_server, udp_alloc_cb, udp_recv_cb);
+ uv_udp_recv_start(g_udp_server, udp_alloc_cb, udp_recv_cb);
uv_run(g_evloop, UV_RUN_DEFAULT);
return 0;
@@ -197,10 +203,45 @@ static void udp_recv_cb(uv_udp_t *udp_server __attribute__((unused)), ssize_t nr
LOGINF("[udp_recv_cb] recv %zd bytes data from %s#%hu", nread, ipstr, portno);
}
- // TODO
+ uv_tcp_t *tcp_client = malloc(sizeof(uv_tcp_t));
+ uv_tcp_init(g_evloop, tcp_client);
+ uv_tcp_nodelay(tcp_client, 1);
+ uint16_t *msglen_ptr = (void *)uvbuf->base - 2;
+ *msglen_ptr = htons(nread);
+ tcp_client->data = uvbuf->base - 2;
+
+ uv_connect_t *connreq = malloc(sizeof(uv_connect_t));
+ int retval = uv_tcp_connect(connreq, tcp_client, (void *)&g_remote_skaddr, tcp_connect_cb);
+ if (retval < 0) {
+ LOGERR("[udp_recv_cb] tcp connect failed: (%d) %s", -retval, uv_strerror(retval));
+ uv_close((void *)tcp_client, tcp_close_cb);
+ free(connreq);
+ return;
+ }
+ IF_VERBOSE LOGINF("[udp_recv_cb] try to connect to %s#%hu", g_remote_ipstr, g_remote_portno);
return;
FREE_UVBUF:
free(uvbuf->base - 2);
}
+
+static void tcp_connect_cb(uv_connect_t *connreq, int status) {
+ // TODO
+}
+
+static void tcp_write_cb(uv_write_t *writereq, int status) {
+ // TODO
+}
+
+static void tcp_alloc_cb(uv_handle_t *tcp_client, size_t sugsize, uv_buf_t *uvbuf) {
+ // TODO
+}
+
+static void tcp_read_cb(uv_stream_t *tcp_client, ssize_t nread, const uv_buf_t *uvbuf) {
+ // TODO
+}
+
+static void tcp_close_cb(uv_handle_t *tcp_client) {
+ // TODO
+}