diff --git a/src/jconf.h b/src/jconf.h index f87e1813..95abe986 100644 --- a/src/jconf.h +++ b/src/jconf.h @@ -3,7 +3,7 @@ #define MAX_REMOTE_NUM 10 #define MAX_CONF_SIZE 16 * 1024 -#define DNS_THREAD 4 +#define DNS_THREAD_NUM 4 typedef struct { int remote_num; diff --git a/src/server.c b/src/server.c index 8fe62206..285d3115 100644 --- a/src/server.c +++ b/src/server.c @@ -239,7 +239,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - query = asyncns_getaddrinfo(server->asyncns, + query = asyncns_getaddrinfo(server->listen_ctx->asyncns, host, port, &hints); if (query == NULL) { @@ -321,7 +321,7 @@ static void server_resolve_cb(EV_P_ ev_timer *watcher, int revents) { struct server_ctx *server_ctx = (struct server_ctx *) (((void*)watcher) - sizeof(ev_io)); struct server *server = server_ctx->server; - asyncns_t *asyncns = server->asyncns; + asyncns_t *asyncns = server->listen_ctx->asyncns; asyncns_query_t *query = server->query; if (asyncns == NULL || query == NULL) { @@ -330,6 +330,20 @@ static void server_resolve_cb(EV_P_ ev_timer *watcher, int revents) { return; } + if (asyncns_wait(asyncns, 0) == -1) { + // asyncns error + LOGE("asnyncns session died."); + close_and_free_server(EV_A_ server); + + // reset asyncns sesstion + asyncns_free(asyncns); + if (!(server->listen_ctx->asyncns = asyncns_new(DNS_THREAD_NUM))) { + FATAL("asyncns failed"); + } + + return; + } + if (!asyncns_isdone(asyncns, query)) { // wait for reolver return; @@ -346,7 +360,7 @@ static void server_resolve_cb(EV_P_ ev_timer *watcher, int revents) { ERROR("getaddrinfo"); close_and_free_server(EV_A_ server); } else { - struct remote *remote = connect_to_remote(result, server->timeout); + struct remote *remote = connect_to_remote(result, server->listen_ctx->timeout); if (remote == NULL) { LOGE("connect error."); close_and_free_server(EV_A_ server); @@ -555,7 +569,7 @@ void close_and_free_remote(EV_P_ struct remote *remote) { } } -struct server* new_server(int fd) { +struct server* new_server(int fd, struct listen_ctx *listener) { server_conn++; struct server *server; server = malloc(sizeof(struct server)); @@ -570,8 +584,8 @@ struct server* new_server(int fd) { server->send_ctx->server = server; server->send_ctx->connected = 0; server->stage = 0; - server->asyncns = NULL; server->query = NULL; + server->listen_ctx = listener; if (enc_conf.method == RC4) { server->e_ctx = malloc(sizeof(struct rc4_state)); server->d_ctx = malloc(sizeof(struct rc4_state)); @@ -628,9 +642,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) { LOGD("accept a connection."); } - struct server *server = new_server(serverfd); - server->timeout = listener->timeout; - server->asyncns = listener->asyncns; + struct server *server = new_server(serverfd, listener); ev_io_start(EV_A_ &server->recv_ctx->io); } @@ -715,7 +727,7 @@ int main (int argc, char **argv) { // Setup asyncns asyncns_t *asyncns; - if (!(asyncns = asyncns_new(DNS_THREAD))) { + if (!(asyncns = asyncns_new(DNS_THREAD_NUM))) { FATAL("asyncns failed"); } diff --git a/src/server.h b/src/server.h index ee9fa86e..76a8814b 100644 --- a/src/server.h +++ b/src/server.h @@ -28,12 +28,11 @@ struct server { char buf[BUF_SIZE]; // server send from, remote recv into char stage; int buf_len; - int timeout; struct rc4_state *e_ctx; struct rc4_state *d_ctx; struct server_ctx *recv_ctx; struct server_ctx *send_ctx; - asyncns_t *asyncns; + struct listen_ctx *listen_ctx; asyncns_query_t *query; struct remote *remote; }; @@ -67,7 +66,7 @@ struct remote* new_remote(int fd, int timeout); struct remote *connect_to_remote(struct addrinfo *res, int timeout); void free_remote(struct remote *remote); void close_and_free_remote(EV_P_ struct remote *remote); -struct server* new_server(int fd); +struct server* new_server(int fd, struct listen_ctx *listener); void free_server(struct server *server); void close_and_free_server(EV_P_ struct server *server);