Browse Source

Merge branch 'master' of github.com:madeye/shadowsocks-libev

pull/4/merge
Max Lv 11 years ago
parent
commit
60363d7443
1 changed files with 36 additions and 7 deletions
  1. 43
      src/server.c

43
src/server.c

@ -66,10 +66,12 @@ int create_and_bind(const char *host, const char *port) {
continue; continue;
int opt = 1; int opt = 1;
int err = setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (err) {
ERROR("setsocket");
}
setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(listen_sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif
s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen); s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
if (s == 0) { if (s == 0) {
@ -94,6 +96,7 @@ int create_and_bind(const char *host, const char *port) {
struct remote *connect_to_remote(struct addrinfo *res, int timeout) { struct remote *connect_to_remote(struct addrinfo *res, int timeout) {
int sockfd; int sockfd;
int opt = 1;
// initilize remote socks // initilize remote socks
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
@ -103,6 +106,11 @@ struct remote *connect_to_remote(struct addrinfo *res, int timeout) {
return NULL; return NULL;
} }
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif
struct remote *remote = new_remote(sockfd, timeout); struct remote *remote = new_remote(sockfd, timeout);
// setup remote socks // setup remote socks
@ -128,6 +136,9 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
if (r == 0) { if (r == 0) {
// connection closed // connection closed
if (verbose) {
LOGD("server_recv close the connection");
}
close_and_free_remote(EV_A_ remote); close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server); close_and_free_server(EV_A_ server);
return; return;
@ -275,6 +286,9 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) {
if (server->buf_len == 0) { if (server->buf_len == 0) {
// close and free // close and free
if (verbose) {
LOGD("server_send close the connection");
}
close_and_free_remote(EV_A_ remote); close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server); close_and_free_server(EV_A_ server);
return; return;
@ -423,6 +437,9 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
if (r == 0) { if (r == 0) {
// connection closed // connection closed
if (verbose) {
LOGD("remote_recv close the connection");
}
close_and_free_remote(EV_A_ remote); close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server); close_and_free_server(EV_A_ server);
return; return;
@ -486,12 +503,11 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
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_io_start(EV_A_ &remote->recv_ctx->io);
server->stage = 5;
if (remote->buf_len == 0) { if (remote->buf_len == 0) {
server->stage = 5;
ev_io_stop(EV_A_ &remote_send_ctx->io); ev_io_stop(EV_A_ &remote_send_ctx->io);
ev_io_start(EV_A_ &server->recv_ctx->io); ev_io_start(EV_A_ &server->recv_ctx->io);
ev_io_start(EV_A_ &remote->recv_ctx->io);
return; return;
} }
@ -506,6 +522,9 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
if (remote->buf_len == 0) { if (remote->buf_len == 0) {
// close and free // close and free
if (verbose) {
LOGD("remote_send close the connection");
}
close_and_free_remote(EV_A_ remote); close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server); close_and_free_server(EV_A_ server);
return; return;
@ -532,6 +551,10 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
ev_io_stop(EV_A_ &remote_send_ctx->io); ev_io_stop(EV_A_ &remote_send_ctx->io);
if (server != NULL) { if (server != NULL) {
ev_io_start(EV_A_ &server->recv_ctx->io); ev_io_start(EV_A_ &server->recv_ctx->io);
if (server->stage == 4) {
server->stage = 5;
ev_io_start(EV_A_ &remote->recv_ctx->io);
}
} else { } else {
LOGE("invalid server."); LOGE("invalid server.");
close_and_free_remote(EV_A_ remote); close_and_free_remote(EV_A_ remote);
@ -655,6 +678,12 @@ static void accept_cb (EV_P_ ev_io *w, int revents) {
} }
setnonblocking(serverfd); setnonblocking(serverfd);
int opt = 1;
setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif
if (verbose) { if (verbose) {
LOGD("accept a connection."); LOGD("accept a connection.");
} }

Loading…
Cancel
Save