Browse Source

WiP

pull/14/head
Max Lv 11 years ago
parent
commit
b60097d5b3
2 changed files with 22 additions and 9 deletions
  1. 29
      src/udprelay.c
  2. 2
      src/udprelay.h

29
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);

2
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;

Loading…
Cancel
Save