mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-29 04:03:45 +00:00
fix asyncns
This commit is contained in:
+1
-1
@@ -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;
|
||||
|
||||
+21
-9
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user