diff options
author | Ralf Habacker <ralf.habacker@freenet.de> | 2018-03-10 13:24:26 +0100 |
---|---|---|
committer | Ralf Habacker <ralf.habacker@freenet.de> | 2018-03-12 18:38:03 +0100 |
commit | a0ac4c40225a3fe09055490554cde89edb991e50 (patch) | |
tree | 611317ed814879d43c51fb2e21895bfefc60511d /dbus/dbus-sysdeps-win.c | |
parent | 98a5011b8144f276867deff38390041939ac7ebd (diff) | |
download | dbus-a0ac4c40225a3fe09055490554cde89edb991e50.tar.gz |
Windows _dbus_listen_tcp_socket: Set socket options SO_REUSEADDR and TCP_NODELAY
Reviewed-by: Simon McVittie <smcv@collabora.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61922
Diffstat (limited to 'dbus/dbus-sysdeps-win.c')
-rw-r--r-- | dbus/dbus-sysdeps-win.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index e23c0caa..94480f66 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -1739,7 +1739,9 @@ _dbus_listen_tcp_socket (const char *host, tmp = ai; while (tmp) { + const int reuseaddr = 1, tcp_nodelay_on = 1; DBusSocket fd = DBUS_SOCKET_INIT, *newlisten_fd; + if ((fd.sock = socket (tmp->ai_family, SOCK_STREAM, 0)) == INVALID_SOCKET) { saved_errno = _dbus_get_low_level_socket_errno (); @@ -1751,6 +1753,22 @@ _dbus_listen_tcp_socket (const char *host, } _DBUS_ASSERT_ERROR_IS_CLEAR(error); + if (setsockopt (fd.sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseaddr, sizeof(reuseaddr)) == SOCKET_ERROR) + { + saved_errno = _dbus_get_low_level_socket_errno (); + _dbus_warn ("Failed to set socket option \"%s:%s\": %s", + host ? host : "*", port, _dbus_strerror (saved_errno)); + } + + /* Nagle's algorithm imposes a huge delay on the initial messages + going over TCP. */ + if (setsockopt (fd.sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&tcp_nodelay_on, sizeof (tcp_nodelay_on)) == SOCKET_ERROR) + { + saved_errno = _dbus_get_low_level_socket_errno (); + _dbus_warn ("Failed to set TCP_NODELAY socket option \"%s:%s\": %s", + host ? host : "*", port, _dbus_strerror (saved_errno)); + } + if (bind (fd.sock, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) == SOCKET_ERROR) { saved_errno = _dbus_get_low_level_socket_errno (); |