|
|
|
@ -76,6 +76,17 @@ def _format_pipe(fd): |
|
|
|
return repr(fd) |
|
|
|
|
|
|
|
|
|
|
|
def _set_reuseport(sock): |
|
|
|
if not hasattr(socket, 'SO_REUSEPORT'): |
|
|
|
raise ValueError('reuse_port not supported by socket module') |
|
|
|
else: |
|
|
|
try: |
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) |
|
|
|
except OSError: |
|
|
|
raise ValueError('reuse_port not supported by socket module, ' |
|
|
|
'SO_REUSEPORT defined but not implemented.') |
|
|
|
|
|
|
|
|
|
|
|
# Linux's sock.type is a bitmask that can include extra info about socket. |
|
|
|
_SOCKET_TYPE_MASK = 0 |
|
|
|
if hasattr(socket, 'SOCK_NONBLOCK'): |
|
|
|
@ -873,12 +884,7 @@ class BaseEventLoop(events.AbstractEventLoop): |
|
|
|
sock.setsockopt( |
|
|
|
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|
|
|
if reuse_port: |
|
|
|
if not hasattr(socket, 'SO_REUSEPORT'): |
|
|
|
raise ValueError( |
|
|
|
'reuse_port not supported by socket module') |
|
|
|
else: |
|
|
|
sock.setsockopt( |
|
|
|
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) |
|
|
|
_set_reuseport(sock) |
|
|
|
if allow_broadcast: |
|
|
|
sock.setsockopt( |
|
|
|
socket.SOL_SOCKET, socket.SO_BROADCAST, 1) |
|
|
|
@ -1001,12 +1007,7 @@ class BaseEventLoop(events.AbstractEventLoop): |
|
|
|
sock.setsockopt( |
|
|
|
socket.SOL_SOCKET, socket.SO_REUSEADDR, True) |
|
|
|
if reuse_port: |
|
|
|
if not hasattr(socket, 'SO_REUSEPORT'): |
|
|
|
raise ValueError( |
|
|
|
'reuse_port not supported by socket module') |
|
|
|
else: |
|
|
|
sock.setsockopt( |
|
|
|
socket.SOL_SOCKET, socket.SO_REUSEPORT, True) |
|
|
|
_set_reuseport(sock) |
|
|
|
# Disable IPv4/IPv6 dual stack support (enabled by |
|
|
|
# default on Linux) which makes a single socket |
|
|
|
# listen on both address families. |
|
|
|
|