diff --git a/channels.c b/channels.c index 6b7d259a443..e4c9c9f2edf 100644 --- a/channels.c +++ b/channels.c @@ -3683,8 +3683,18 @@ channel_setup_fwd_listener_tcpip(struct ssh *ssh, int type, strerror(errno)); continue; } - +#ifndef WINDOWS + /* + Setting the SO_REUSEADDR flag on a socket behaves differently on Windows than on *NIX OS. + On *NIX OS, the flag is used for handling specific edge cases and allows the port to be reused + while busy only during TIME_WAIT state in the short period after termination. + On Windows, the option allows a socket to forcibly bind to a port in use by another socket in any + state. + This was allowing more than one socket to be created in the same port on Windows, which is + unnexpected behavior. + */ set_reuseaddr(sock); +#endif if (ai->ai_family == AF_INET6) sock_set_v6only(sock); diff --git a/sshd.c b/sshd.c index c209a9c241a..0df7e8a69cb 100644 --- a/sshd.c +++ b/sshd.c @@ -1472,7 +1472,9 @@ listen_on_addrs(struct listenaddr *la) continue; } /* Socket options */ +#ifndef WINDOWS set_reuseaddr(listen_sock); +#endif if (la->rdomain != NULL && set_rdomain(listen_sock, la->rdomain) == -1) { close(listen_sock);