From 3b074205506ca6ef9bdd8fb850569ef9eec3613f Mon Sep 17 00:00:00 2001 From: Max Lv Date: Tue, 13 Jan 2015 09:07:53 +0800 Subject: [PATCH] refine tcp_nodelay --- src/local.c | 18 ++++++++++-------- src/redir.c | 28 +++++++++++++++------------- src/server.c | 6 ++++-- src/tunnel.c | 18 ++++++++++-------- 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/local.c b/src/local.c index 75b32139..21069c3c 100644 --- a/src/local.c +++ b/src/local.c @@ -806,27 +806,28 @@ static struct remote * connect_to_remote(struct listen_ctx *listener, remote_addr = addr; } - int sockfd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); + int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); - if (sockfd < 0) { + if (remotefd < 0) { ERROR("socket"); return NULL; } -#ifdef SO_NOSIGPIPE int opt = 1; - setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); + setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE + setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif // Setup - setnonblocking(sockfd); + setnonblocking(remotefd); #ifdef SET_INTERFACE if (listener->iface) { - setinterface(sockfd, listener->iface); + setinterface(remotefd, listener->iface); } #endif - struct remote *remote = new_remote(sockfd, listener->timeout); + struct remote *remote = new_remote(remotefd, listener->timeout); remote->addr_len = get_sockaddr_len(remote_addr); memcpy(&(remote->addr), remote_addr, remote->addr_len); @@ -853,8 +854,9 @@ void accept_cb(EV_P_ ev_io *w, int revents) return; } setnonblocking(serverfd); -#ifdef SO_NOSIGPIPE int opt = 1; + setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif diff --git a/src/redir.c b/src/redir.c index 63e529fe..3e6429dc 100644 --- a/src/redir.c +++ b/src/redir.c @@ -546,47 +546,49 @@ static void accept_cb(EV_P_ ev_io *w, int revents) struct sockaddr_storage destaddr; int err; - int clientfd = accept(listener->fd, NULL, NULL); - if (clientfd == -1) { + int serverfd = accept(listener->fd, NULL, NULL); + if (serverfd == -1) { ERROR("accept"); return; } - err = getdestaddr(clientfd, &destaddr); + err = getdestaddr(serverfd, &destaddr); if (err) { ERROR("getdestaddr"); return; } - setnonblocking(clientfd); -#ifdef SO_NOSIGPIPE + setnonblocking(serverfd); int opt = 1; - setsockopt(clientfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); + setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE + setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif int index = rand() % listener->remote_num; struct sockaddr *remote_addr = listener->remote_addr[index]; - int sockfd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); - if (sockfd < 0) { + int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); + if (remotefd < 0) { ERROR("socket"); return; } + setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); #ifdef SO_NOSIGPIPE - setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); + setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif // Setup - setnonblocking(sockfd); + setnonblocking(remotefd); - struct server *server = new_server(clientfd, listener->method); - struct remote *remote = new_remote(sockfd, listener->timeout); + struct server *server = new_server(serverfd, listener->method); + struct remote *remote = new_remote(remotefd, listener->timeout); server->remote = remote; remote->server = server; server->destaddr = destaddr; - connect(sockfd, remote_addr, get_sockaddr_len(remote_addr)); + connect(remotefd, remote_addr, get_sockaddr_len(remote_addr)); // listen to remote connected event ev_io_start(EV_A_ & remote->send_ctx->io); ev_timer_start(EV_A_ & remote->send_ctx->watcher); diff --git a/src/server.c b/src/server.c index 0e6ba93d..6e9d4be0 100644 --- a/src/server.c +++ b/src/server.c @@ -223,8 +223,9 @@ static struct remote *connect_to_remote(struct addrinfo *res, return NULL; } -#ifdef SO_NOSIGPIPE int opt = 1; + setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif @@ -956,8 +957,9 @@ static void accept_cb(EV_P_ ev_io *w, int revents) } setnonblocking(serverfd); -#ifdef SO_NOSIGPIPE int opt = 1; + setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif diff --git a/src/tunnel.c b/src/tunnel.c index 3b7939c3..bfcfe9d6 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -610,38 +610,40 @@ static void accept_cb(EV_P_ ev_io *w, int revents) return; } setnonblocking(serverfd); -#ifdef SO_NOSIGPIPE int opt = 1; + setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); +#ifdef SO_NOSIGPIPE setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif int index = rand() % listener->remote_num; struct sockaddr *remote_addr = listener->remote_addr[index]; - int sockfd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); - if (sockfd < 0) { + int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP); + if (remotefd < 0) { ERROR("socket"); return; } + setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); #ifdef SO_NOSIGPIPE - setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); + setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif // Setup - setnonblocking(sockfd); + setnonblocking(remotefd); #ifdef SET_INTERFACE if (listener->iface) { - setinterface(sockfd, listener->iface); + setinterface(remotefd, listener->iface); } #endif struct server *server = new_server(serverfd, listener->method); - struct remote *remote = new_remote(sockfd, listener->timeout); + struct remote *remote = new_remote(remotefd, listener->timeout); server->destaddr = listener->tunnel_addr; server->remote = remote; remote->server = server; - connect(sockfd, remote_addr, get_sockaddr_len(remote_addr)); + connect(remotefd, remote_addr, get_sockaddr_len(remote_addr)); // listen to remote connected event ev_io_start(EV_A_ & remote->send_ctx->io); ev_timer_start(EV_A_ & remote->send_ctx->watcher);