diff --git a/copyparty/__main__.py b/copyparty/__main__.py index 3463a037..10efe73a 100755 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -657,6 +657,8 @@ def run_argparse( ap2.add_argument("-p", metavar="PORT", type=u, default="3923", help="ports to bind (comma/range)") ap2.add_argument("--ll", action="store_true", help="enable link-local IPv6 (supported by ie11 and firefox (not chrome)) -- breaks some mdns clients") ap2.add_argument("--rproxy", metavar="DEPTH", type=int, default=1, help="which ip to keep; [\033[32m0\033[0m]=tcp, [\033[32m1\033[0m]=origin (first x-fwd), [\033[32m2\033[0m]=cloudflare, [\033[32m3\033[0m]=nginx, [\033[32m-1\033[0m]=closest proxy") + if ANYWIN: + ap2.add_argument("--reuseaddr", action="store_true", help="set reuseaddr on listening sockets on windows; allows rapid restart of copyparty at the expense of being able to accidentally start multiple instances") ap2.add_argument("--s-wr-sz", metavar="B", type=int, default=256*1024, help="socket write size in bytes") ap2.add_argument("--s-wr-slp", metavar="SEC", type=float, default=0, help="debug: socket write delay in seconds") ap2.add_argument("--rsp-slp", metavar="SEC", type=float, default=0, help="debug: response delay in seconds") diff --git a/copyparty/httpsrv.py b/copyparty/httpsrv.py index 6d321182..75a8b9af 100644 --- a/copyparty/httpsrv.py +++ b/copyparty/httpsrv.py @@ -28,7 +28,7 @@ except ImportError: ) sys.exit(1) -from .__init__ import MACOS, TYPE_CHECKING, EnvParams +from .__init__ import ANYWIN, MACOS, TYPE_CHECKING, EnvParams from .bos import bos from .httpconn import HttpConn from .util import ( @@ -182,9 +182,12 @@ class HttpSrv(object): sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except: pass - sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if not ANYWIN or self.args.reuseaddr: + sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sck.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - sck.settimeout(None) # < does not inherit, ^ does + sck.settimeout(None) # < does not inherit, ^ opts above do self.ip, self.port = sck.getsockname()[:2] self.srvs.append(sck) diff --git a/copyparty/tcpsrv.py b/copyparty/tcpsrv.py index c0917ed1..b4e1128d 100644 --- a/copyparty/tcpsrv.py +++ b/copyparty/tcpsrv.py @@ -199,9 +199,12 @@ class TcpSrv(object): srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except: pass - srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if not ANYWIN or self.args.reuseaddr: + srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + srv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - srv.settimeout(None) # < does not inherit, ^ does + srv.settimeout(None) # < does not inherit, ^ opts above do try: srv.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False)