Browse Source

Allow long direct TCP connections

Fixes https://github.com/shadowsocks/shadowsocks-android/issues/2078.
pull/2269/head
Mygod 5 years ago
parent
commit
dc298c4f2b
1 changed files with 10 additions and 10 deletions
  1. 20
      src/local.c

20
src/local.c

@ -142,7 +142,7 @@ static int create_and_bind(const char *addr, const char *port);
#ifdef HAVE_LAUNCHD #ifdef HAVE_LAUNCHD
static int launch_or_create(const char *addr, const char *port); static int launch_or_create(const char *addr, const char *port);
#endif #endif
static remote_t *create_remote(listen_ctx_t *listener, struct sockaddr *addr);
static remote_t *create_remote(listen_ctx_t *listener, struct sockaddr *addr, int direct);
static void free_remote(remote_t *remote); static void free_remote(remote_t *remote);
static void close_and_free_remote(EV_P_ remote_t *remote); static void close_and_free_remote(EV_P_ remote_t *remote);
static void free_server(server_t *server); static void free_server(server_t *server);
@ -568,9 +568,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
else else
err = get_sockaddr(ip, port, &storage, 0, ipv6first); err = get_sockaddr(ip, port, &storage, 0, ipv6first);
if (err != -1) { if (err != -1) {
remote = create_remote(server->listener, (struct sockaddr *)&storage);
if (remote != NULL)
remote->direct = 1;
remote = create_remote(server->listener, (struct sockaddr *)&storage, 1);
} }
} }
} }
@ -578,7 +576,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
not_bypass: not_bypass:
// Not bypass // Not bypass
if (remote == NULL) { if (remote == NULL) {
remote = create_remote(server->listener, NULL);
remote = create_remote(server->listener, NULL, 0);
if (sni_detected && acl if (sni_detected && acl
#ifdef __ANDROID__ #ifdef __ANDROID__
@ -643,7 +641,7 @@ server_stream(EV_P_ ev_io *w, buffer_t *buf)
return; return;
} }
ev_timer_again(EV_A_ & remote->recv_ctx->watcher);
if (!remote->direct) ev_timer_again(EV_A_ & remote->recv_ctx->watcher);
// insert shadowsocks header // insert shadowsocks header
if (!remote->direct) { if (!remote->direct) {
@ -1010,7 +1008,7 @@ remote_recv_cb(EV_P_ ev_io *w, int revents)
remote_t *remote = remote_recv_ctx->remote; remote_t *remote = remote_recv_ctx->remote;
server_t *server = remote->server; server_t *server = remote->server;
ev_timer_again(EV_A_ & remote->recv_ctx->watcher);
if (!remote->direct) ev_timer_again(EV_A_ & remote->recv_ctx->watcher);
ssize_t r = recv(remote->fd, server->buf->data, BUF_SIZE, 0); ssize_t r = recv(remote->fd, server->buf->data, BUF_SIZE, 0);
@ -1125,7 +1123,7 @@ remote_send_cb(EV_P_ ev_io *w, int revents)
if (r == 0) { if (r == 0) {
remote_send_ctx->connected = 1; remote_send_ctx->connected = 1;
ev_timer_stop(EV_A_ & remote_send_ctx->watcher); ev_timer_stop(EV_A_ & remote_send_ctx->watcher);
ev_timer_start(EV_A_ & remote->recv_ctx->watcher);
if (!remote->direct) ev_timer_start(EV_A_ & remote->recv_ctx->watcher);
ev_io_start(EV_A_ & remote->recv_ctx->io); ev_io_start(EV_A_ & remote->recv_ctx->io);
// no need to send any data // no need to send any data
@ -1315,7 +1313,8 @@ close_and_free_server(EV_P_ server_t *server)
static remote_t * static remote_t *
create_remote(listen_ctx_t *listener, create_remote(listen_ctx_t *listener,
struct sockaddr *addr)
struct sockaddr *addr,
int direct)
{ {
struct sockaddr *remote_addr; struct sockaddr *remote_addr;
@ -1367,9 +1366,10 @@ create_remote(listen_ctx_t *listener,
} }
#endif #endif
remote_t *remote = new_remote(remotefd, listener->timeout);
remote_t *remote = new_remote(remotefd, direct ? MAX_CONNECT_TIMEOUT : listener->timeout);
remote->addr_len = get_sockaddr_len(remote_addr); remote->addr_len = get_sockaddr_len(remote_addr);
memcpy(&(remote->addr), remote_addr, remote->addr_len); memcpy(&(remote->addr), remote_addr, remote->addr_len);
remote->direct = direct;
return remote; return remote;
} }

Loading…
Cancel
Save