summaryrefslogtreecommitdiff
path: root/src/signaler.cpp
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2012-04-13 06:32:24 +0200
committerMartin Sustrik <sustrik@250bpm.com>2012-04-14 04:59:27 +0200
commitf34f71bbd5b9b00b295aa6438dd251845547225c (patch)
treee5a84ab763991bea17a0aa66ab2c11d12c340f06 /src/signaler.cpp
parent048f8816f6bea585b092b528b9da648a32a9c94c (diff)
Set options on new sockets in systematic manner
This patch consolidates the up-to-now scattered code that sets different options on newly created sockets. There are open_socket and open_tcp_socket functions that do the tuning automatically. In case the socket is not created but got from elsewhere (such as accept() call) there are tune_socket and tune_tcp_socket functions that will do the tuning. Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src/signaler.cpp')
-rw-r--r--src/signaler.cpp33
1 files changed, 10 insertions, 23 deletions
diff --git a/src/signaler.cpp b/src/signaler.cpp
index 4d983a8..1dbd9bb 100644
--- a/src/signaler.cpp
+++ b/src/signaler.cpp
@@ -288,17 +288,13 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
// Create listening socket.
SOCKET listener;
- listener = open_socket (AF_INET, SOCK_STREAM, 0);
+ listener = open_tcp_socket (AF_INET, false);
wsa_assert (listener != INVALID_SOCKET);
- // Set SO_REUSEADDR and TCP_NODELAY on listening socket.
- BOOL so_reuseaddr = 1;
+ // Set SO_REUSEADDR on the listening socket.
+ BOOL reuseaddr = 1;
int rc = setsockopt (listener, SOL_SOCKET, SO_REUSEADDR,
- (char *)&so_reuseaddr, sizeof (so_reuseaddr));
- wsa_assert (rc != SOCKET_ERROR);
- BOOL tcp_nodelay = 1;
- rc = setsockopt (listener, IPPROTO_TCP, TCP_NODELAY,
- (char *)&tcp_nodelay, sizeof (tcp_nodelay));
+ (char*) &reuseaddr, sizeof (reuseaddr));
wsa_assert (rc != SOCKET_ERROR);
// Bind listening socket to the local port.
@@ -315,14 +311,9 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
wsa_assert (rc != SOCKET_ERROR);
// Create the writer socket.
- *w_ = WSASocket (AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
+ *w_ = open_tcp_socket (AF_INET, false);
wsa_assert (*w_ != INVALID_SOCKET);
- // Set TCP_NODELAY on writer socket.
- rc = setsockopt (*w_, IPPROTO_TCP, TCP_NODELAY,
- (char *)&tcp_nodelay, sizeof (tcp_nodelay));
- wsa_assert (rc != SOCKET_ERROR);
-
// Connect writer to the listener.
rc = connect (*w_, (sockaddr *) &addr, sizeof (addr));
wsa_assert (rc != SOCKET_ERROR);
@@ -330,6 +321,7 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
// Accept connection from writer.
*r_ = accept (listener, NULL, NULL);
wsa_assert (*r_ != INVALID_SOCKET);
+ tune_tcp_socket (*r_, false);
// We don't need the listening socket anymore. Close it.
rc = closesocket (listener);
@@ -355,17 +347,14 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
lcladdr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
lcladdr.sin_port = 0;
- int listener = open_socket (AF_INET, SOCK_STREAM, 0);
+ int listener = open_tcp_socket (AF_INET, false);
errno_assert (listener != -1);
int on = 1;
- int rc = setsockopt (listener, IPPROTO_TCP, TCP_NODELAY, &on, sizeof (on));
- errno_assert (rc != -1);
-
rc = setsockopt (listener, IPPROTO_TCP, TCP_NODELACK, &on, sizeof (on));
errno_assert (rc != -1);
- rc = bind(listener, (struct sockaddr*) &lcladdr, sizeof (lcladdr));
+ rc = bind (listener, (struct sockaddr*) &lcladdr, sizeof (lcladdr));
errno_assert (rc != -1);
socklen_t lcladdr_len = sizeof (lcladdr);
@@ -376,12 +365,9 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
rc = listen (listener, 1);
errno_assert (rc != -1);
- *w_ = open_socket (AF_INET, SOCK_STREAM, 0);
+ *w_ = open_tcp_socket (AF_INET, false);
errno_assert (*w_ != -1);
- rc = setsockopt (*w_, IPPROTO_TCP, TCP_NODELAY, &on, sizeof (on));
- errno_assert (rc != -1);
-
rc = setsockopt (*w_, IPPROTO_TCP, TCP_NODELACK, &on, sizeof (on));
errno_assert (rc != -1);
@@ -390,6 +376,7 @@ int xs::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
*r_ = accept (listener, NULL, NULL);
errno_assert (*r_ != -1);
+ tune_tcp_socket (*r_);
close (listener);