Browse Source

fix asyncns

pull/4/merge
Max Lv 12 years ago
parent
commit
161d48b850
3 changed files with 24 additions and 13 deletions
  1. 2
      src/jconf.h
  2. 30
      src/server.c
  3. 5
      src/server.h

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

30
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");
}

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

Loading…
Cancel
Save