diff --git a/src/udprelay.c b/src/udprelay.c index f5eec963..866669c4 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -244,13 +244,13 @@ static void server_timeout_cb(EV_P_ ev_timer *watcher, int revents) { static void query_resolve_cb(EV_P_ ev_timer *watcher, int revents) { int err; struct addrinfo *result, *rp; - struct quert_ctx *query_ctx = (struct quert_ctx *)((void*)watcher); + struct query_ctx *query_ctx = (struct query_ctx *)((void*)watcher); asyncns_t *asyncns = query_ctx->asyncns; asyncns_query_t *query = query_ctx->query; if (asyncns == NULL || query == NULL) { LOGE("invalid dns query."); - close_and_free_query(EV_A_ quert_ctx); + close_and_free_query(EV_A_ query_ctx); return; } @@ -260,7 +260,7 @@ static void query_resolve_cb(EV_P_ ev_timer *watcher, int revents) { } if (!asyncns_isdone(asyncns, query)) { - // wait for reolver + // wait reolver return; } @@ -299,22 +299,30 @@ static void query_resolve_cb(EV_P_ ev_timer *watcher, int revents) { struct remote_ctx *remote_ctx = new_remote_ctx(remotefd); remote_ctx->dst_addr = *rp->ai_addr; remote_ctx->server_ctx = query_ctx->server_ctx; + remote_ctx->addr_header_len = query_ctx->addr_header_len; + memcpy(remote_ctx->addr_header, query_ctx->addr_header, query_ctx->addr_header_len); ev_io_start(EV_A_ &remote_ctx->io); + + int w = sendto(remote_ctx->fd, buf, buf_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr)); + + if (w == -1) { + ERROR("udprelay_sendto_remote"); + close_and_free_remote(EV_A_ remote_ctx); + } + } else { - ERROR("socket"); - close(remotefd); + ERROR("udprelay bind() error.."); } } // release addrinfo asyncns_freeaddrinfo(result); - close_and_free_query(EV_A_ quert_ctx); + close_and_free_query(EV_A_ query_ctx); } static void remote_recv_cb (EV_P_ ev_io *w, int revents) { struct remote_ctx *remote_ctx = (struct remote_ctx *)w; - struct server_ctx *server_ctx = remote_ctx->server_ctx; if (server_ctx == NULL) { LOGE("invalid server."); @@ -545,6 +553,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { remote_ctx->src_addr = src_addr; remote_ctx->dst_addr = *result->ai_addr; remote_ctx->server_ctx = server_ctx; + remote_ctx->addr_header_len = addr_header_len; memcpy(remote_ctx->addr_header, addr_header, addr_header_len); ev_io_start(EV_A_ &remote_ctx->io); @@ -557,7 +566,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { int w = sendto(remote_ctx->fd, buf, buf_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr)); if (w == -1) { - ERROR("udprelay_server_sendto"); + ERROR("udprelay_sendto_remote"); + close_and_free_remote(EV_A_ remote_ctx); } freeaddrinfo(result); @@ -573,7 +583,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { struct addrinfo hints; asyncns_query_t *query; - memset(&hints, 0, sizeof hints); + memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -587,6 +597,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { struct query_ctx *query_ctx = new_query_ctx(query, buf, buf_len); query_ctx->server_ctx = server_ctx; + query_ctx->addr_header_len = addr_header_len; memcpy(query_ctx->addr_header, addr_header, addr_header_len); ev_timer_start(EV_A_ &query_ctx->watcher); diff --git a/src/udprelay.h b/src/udprelay.h index 64187cfe..f727dd9c 100644 --- a/src/udprelay.h +++ b/src/udprelay.h @@ -30,6 +30,7 @@ struct query_ctx { struct sockaddr src_addr; int buf_len; char *buf; // server send from, remote recv into + int addr_header_len; char addr_header[384]; struct server_ctx *server_ctx; } @@ -40,6 +41,7 @@ struct remote_ctx { int fd; int buf_len; char *buf; // remote send from, server recv into + int addr_header_len; char addr_header[384]; struct sockaddr dst_addr; struct server_ctx *server_ctx;