From e7fb50add3f62d8ba94bb5db2d0014ee5837f668 Mon Sep 17 00:00:00 2001 From: Pavel Minaev Date: Thu, 20 Oct 2022 00:34:38 -0700 Subject: [PATCH] Do not use SO_REUSEADDR et all when listening on ephemeral ports (#1064) --- src/debugpy/common/sockets.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/debugpy/common/sockets.py b/src/debugpy/common/sockets.py index c76a40f7..453dbf1a 100644 --- a/src/debugpy/common/sockets.py +++ b/src/debugpy/common/sockets.py @@ -21,6 +21,17 @@ def create_server(host, port=0, backlog=socket.SOMAXCONN, timeout=None): try: server = _new_sock() + if port != 0: + # If binding to a specific port, make sure that the user doesn't have + # to wait until the OS times out the socket to be able to use that port + # again.if the server or the adapter crash or are force-killed. + if sys.platform == "win32": + server.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + try: + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + except (AttributeError, OSError): + pass # Not available everywhere server.bind((host, port)) if timeout is not None: server.settimeout(timeout) @@ -38,13 +49,6 @@ def create_client(): def _new_sock(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) - if sys.platform == "win32": - sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - else: - try: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - except (AttributeError, OSError): - pass # Not available everywhere # Set TCP keepalive on an open socket. # It activates after 1 second (TCP_KEEPIDLE,) of idleness,