refine tcp_nodelay

This commit is contained in:
Max Lv
2015-01-13 09:07:53 +08:00
parent 1dd6c726be
commit 3b07420550
4 changed files with 39 additions and 31 deletions
+10 -8
View File
@@ -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
+15 -13
View File
@@ -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);
+4 -2
View File
@@ -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
+10 -8
View File
@@ -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);