From 57f6e87fcfde08a9f199502734e1ee5dd917896e Mon Sep 17 00:00:00 2001 From: Max Lv Date: Mon, 31 Dec 2012 12:14:26 +0800 Subject: [PATCH] detect timeout --- assets/shadowsocks | Bin 42312 -> 42312 bytes jni/shadowsocks/local.c | 99 +++++++++++++++++++++++++++------------ jni/shadowsocks/local.h | 18 ++++--- libs/armeabi/pdnsd | Bin 153256 -> 153256 bytes libs/armeabi/shadowsocks | Bin 42312 -> 42312 bytes 5 files changed, 81 insertions(+), 36 deletions(-) diff --git a/assets/shadowsocks b/assets/shadowsocks index d497239b059de0be547178f84648f82f199dfac7..c7f2e590c62ae0c40b4442a09b3ef87792192678 100755 GIT binary patch delta 6013 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 delta 5369 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 diff --git a/jni/shadowsocks/local.c b/jni/shadowsocks/local.c index f52e449d..36f22150 100644 --- a/jni/shadowsocks/local.c +++ b/jni/shadowsocks/local.c @@ -28,11 +28,7 @@ static char *_server; static char *_remote_port; - -struct client_ctx { - ev_io io; - int fd; -}; +static int _timeout; int setnonblocking(int fd) { int flags; @@ -58,11 +54,15 @@ int create_and_bind(const char *port) { for (rp = result; rp != NULL; rp = rp->ai_next) { listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); - int opt = 1; - setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); if (listen_sock == -1) continue; + int opt = 1; + int err = setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + if (err) { + perror("setsocket"); + } + s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen); if (s == 0) { /* We managed to bind successfully! */ @@ -106,10 +106,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { if (r == 0) { // connection closed *buf_len = 0; + close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); - if (remote != NULL) { - ev_io_start(EV_A_ &remote->send_ctx->io); - } return; } else if(r < 0) { if (errno == EAGAIN) { @@ -118,8 +116,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { break; } else { perror("server recv"); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } } @@ -136,8 +134,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { break; } else { perror("send"); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } } else if(w < r) { @@ -173,8 +171,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { response.atyp = 1; char *send_buf = (char *)&response; send(server->fd, send_buf, 4, MSG_NOSIGNAL); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } @@ -204,8 +202,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { addr_to_send[addr_len] = 0; } else { LOGE("unsupported addrtype: %d\n", request->atyp); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } @@ -247,8 +245,8 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { struct remote *remote = server->remote; if (server->buf_len == 0) { // close and free - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } else { // has data to send @@ -257,8 +255,8 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { if (r < 0) { if (errno != EAGAIN) { perror("send"); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } return; @@ -280,8 +278,8 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { if (remote != NULL) { ev_io_start(EV_A_ &remote->recv_ctx->io); } else { - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } } @@ -289,6 +287,24 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { } +static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) { + struct remote_ctx *remote_ctx = (struct remote_ctx *) (((void*)watcher) + - sizeof(ev_io)); + struct remote *remote = remote_ctx->remote; + struct server *server = remote->server; + + LOGD("remote timeout"); + + ev_timer_stop(EV_A_ watcher); + + if (server == NULL) { + close_and_free_remote(EV_A_ remote); + return; + } + close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); +} + static void remote_recv_cb (EV_P_ ev_io *w, int revents) { struct remote_ctx *remote_recv_ctx = (struct remote_ctx *)w; struct remote *remote = remote_recv_ctx->remote; @@ -304,9 +320,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { // connection closed server->buf_len = 0; close_and_free_remote(EV_A_ remote); - if (server != NULL) { - ev_io_start(EV_A_ &server->send_ctx->io); - } + close_and_free_server(EV_A_ server); return; } else if(r < 0) { if (errno == EAGAIN) { @@ -315,8 +329,8 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { break; } else { perror("remote recv"); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } } @@ -330,8 +344,8 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { break; } else { perror("send"); - close_and_free_server(EV_A_ server); close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); return; } } else if(w < r) { @@ -357,15 +371,16 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { if (!remote_send_ctx->connected) { - socklen_t len; struct sockaddr_storage addr; - len = sizeof addr; + socklen_t len = sizeof addr; int r = getpeername(remote->fd, (struct sockaddr*)&addr, &len); if (r == 0) { remote_send_ctx->connected = 1; ev_io_stop(EV_A_ &remote_send_ctx->io); + ev_timer_stop(EV_A_ &remote_send_ctx->watcher); ev_io_start(EV_A_ &server->recv_ctx->io); ev_io_start(EV_A_ &remote->recv_ctx->io); + return; } else { perror("getpeername"); // not connected @@ -423,17 +438,19 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { struct remote* new_remote(int fd) { struct remote *remote; remote = malloc(sizeof(struct remote)); - remote->fd = fd; remote->recv_ctx = malloc(sizeof(struct remote_ctx)); remote->send_ctx = malloc(sizeof(struct remote_ctx)); + remote->fd = fd; ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ); ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE); + ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, _timeout, 0); remote->recv_ctx->remote = remote; remote->recv_ctx->connected = 0; remote->send_ctx->remote = remote; remote->send_ctx->connected = 0; return remote; } + void free_remote(struct remote *remote) { if (remote != NULL) { if (remote->server != NULL) { @@ -446,6 +463,7 @@ void free_remote(struct remote *remote) { } void close_and_free_remote(EV_P_ struct remote *remote) { if (remote != NULL) { + ev_timer_stop(EV_A_ &remote->send_ctx->watcher); ev_io_stop(EV_A_ &remote->send_ctx->io); ev_io_stop(EV_A_ &remote->recv_ctx->io); close(remote->fd); @@ -455,9 +473,9 @@ void close_and_free_remote(EV_P_ struct remote *remote) { struct server* new_server(int fd) { struct server *server; server = malloc(sizeof(struct server)); - server->fd = fd; server->recv_ctx = malloc(sizeof(struct server_ctx)); server->send_ctx = malloc(sizeof(struct server_ctx)); + server->fd = fd; ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); server->recv_ctx->server = server; @@ -502,15 +520,32 @@ static void accept_cb (EV_P_ ev_io *w, int revents) memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - getaddrinfo(_server, _remote_port, &hints, &res); + int err = getaddrinfo(_server, _remote_port, &hints, &res); + if (err) { + perror("getaddrinfo"); + close_and_free_server(EV_A_ server); + break; + } + sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd < 0) { perror("socket"); close(sockfd); close_and_free_server(EV_A_ server); freeaddrinfo(res); - continue; + break; } + + struct timeval timeout; + timeout.tv_sec = _timeout; + timeout.tv_usec = 0; + err = setsockopt(sockfd, SOL_SOCKET, + SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); + if (err) perror("setsockopt"); + err = setsockopt(sockfd, SOL_SOCKET, + SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); + if (err) perror("setsockopt"); + setnonblocking(sockfd); struct remote *remote = new_remote(sockfd); server->remote = remote; @@ -519,6 +554,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) freeaddrinfo(res); // listen to remote connected event ev_io_start(EV_A_ &remote->send_ctx->io); + ev_timer_start(EV_A_ &remote->send_ctx->watcher); break; } } @@ -530,12 +566,13 @@ int main (int argc, char **argv) char *remote_port = NULL; char *port = NULL; char *key = NULL; + char* timeout = "10"; int c; int f_flags = 0; opterr = 0; - while ((c = getopt (argc, argv, "fs:p:l:k:")) != -1) { + while ((c = getopt (argc, argv, "fs:p:l:k:t:")) != -1) { switch (c) { case 's': server = optarg; @@ -552,6 +589,9 @@ int main (int argc, char **argv) case 'f': f_flags = 1; break; + case 't': + timeout = optarg; + break; } } @@ -611,6 +651,7 @@ int main (int argc, char **argv) _server = strdup(server); _remote_port = strdup(remote_port); + _timeout = atoi(timeout); LOGD("calculating ciphers"); get_table(key); diff --git a/jni/shadowsocks/local.h b/jni/shadowsocks/local.h index 97fd3139..db8042fc 100644 --- a/jni/shadowsocks/local.h +++ b/jni/shadowsocks/local.h @@ -10,6 +10,12 @@ struct listen_ctx { struct sockaddr sock; }; +struct server_ctx { + ev_io io; + int connected; + struct server *server; +}; + struct server { int fd; char buf[BUF_SIZE]; // server send from, remote recv into @@ -19,11 +25,14 @@ struct server { struct server_ctx *send_ctx; struct remote *remote; }; -struct server_ctx { + +struct remote_ctx { ev_io io; + ev_timer watcher; int connected; - struct server *server; + struct remote *remote; }; + struct remote { int fd; char buf[BUF_SIZE]; // remote send from, server recv into @@ -32,11 +41,6 @@ struct remote { struct remote_ctx *send_ctx; struct server *server; }; -struct remote_ctx { - ev_io io; - int connected; - struct remote *remote; -}; static void accept_cb (EV_P_ ev_io *w, int revents); diff --git a/libs/armeabi/pdnsd b/libs/armeabi/pdnsd index d82c8adae0913df7b4a35f4335b22bc0ca30ea88..6eab9734f199fdf498038d5910b4285ebbf5e7da 100755 GIT binary patch delta 22020 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 delta 22030 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 delta 5369 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