aboutsummaryrefslogtreecommitdiff
path: root/src/connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/connect.c')
-rw-r--r--src/connect.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/connect.c b/src/connect.c
index 50c9e997..d7c2a32c 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -74,6 +74,7 @@
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#endif /* _WIN32 */
@@ -216,6 +217,12 @@ static int ssh_connect_ai_timeout(ssh_session session, const char *host,
return s;
}
+static int set_tcp_nodelay(socket_t socket)
+{
+ int opt = 1;
+ return setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
+}
+
/**
* @internal
*
@@ -387,6 +394,18 @@ socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host,
continue;
}
+ if (session->opts.nodelay) {
+ /* For winsock, socket options are only effective before connect */
+ rc = set_tcp_nodelay(s);
+ if (rc < 0) {
+ ssh_set_error(session, SSH_FATAL,
+ "Failed to set TCP_NODELAY on socket: %s", strerror(errno));
+ ssh_connect_socket_close(s);
+ s = -1;
+ continue;
+ }
+ }
+
errno = 0;
rc = connect(s, itr->ai_addr, itr->ai_addrlen);
if (rc == -1 && (errno != 0) && (errno != EINPROGRESS)) {