12 def __init__(self, servers):
18 def start_serving(self):
20 server.start_serving()
22 async def serve_forever(self):
23 raise NotImplementedError
26 raise NotImplementedError
32 sockets.extend(server.sockets)
39 async def wait_closed(self):
54 sock = bind_socket(host, port)
55 return _create_server(factory, loop=loop, sock=sock, **kwargs)
58def create_unix_server(
66 return _create_unix_server(
67 factory, loop=loop, path=path, sock=sock, **kwargs
71@contextlib.asynccontextmanager
72async def create_server_multiple(factory, sockets, *, loop=None, **kwargs):
75 loop = asyncio.get_running_loop()
78 server = await loop.create_server(factory, sock=sock, **kwargs)
79 servers.append(server)
88async def start_multiple_servers(
89 client_connected_cb, sockets, *, loop=None, **kwargs
90) -> MultipleSocketServer:
95 server = await asyncio.start_server(
96 client_connected_cb, sock=sock, **kwargs
98 servers.append(server)
102def bind_socket_multiple(
103 hostname='localhost',
105 family=socket.AF_UNSPEC,
106 type=socket.SOCK_STREAM,
107 backlog=DEFAULT_BACKLOG,
111 Bind multiple sockets for both IPv4 and IPv6 addresses.
113 If `port` is zero tries to bind the same port for all addresses,
118 return _bind_socket_multiple(
126 if retries
and not port:
127 for _
in range(retries):
130 except socket.error
as err:
131 if err.errno == errno.EADDRINUSE:
137 hostname='localhost',
139 family=socket.AF_INET,
140 type=socket.SOCK_STREAM,
142 backlog=DEFAULT_BACKLOG,
144 sock = socket.socket(family, type, proto)
145 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
146 sock.bind((hostname, port))
153 backlog=DEFAULT_BACKLOG,
155 sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
156 sock.bind(str(socket_path))
161@contextlib.contextmanager
162def closing_sockets(sockets):
170@contextlib.contextmanager
171def _close_sockets_on_error(sockets):
180@contextlib.asynccontextmanager
181async def _create_server(factory, *, loop=None, **kwargs):
183 loop = asyncio.get_running_loop()
184 server = await loop.create_server(factory, **kwargs)
191@contextlib.asynccontextmanager
192async def _create_unix_server(factory, *, loop=None, **kwargs):
194 loop = asyncio.get_running_loop()
195 server = await loop.create_unix_server(factory, **kwargs)
202def _bind_socket_multiple(
211 Bind multiple sockets for both IPv4 and IPv6 addresses.
213 infos = socket.getaddrinfo(
214 hostname, port, family=family, type=type, flags=socket.AI_PASSIVE
216 with _close_sockets_on_error([])
as sockets:
217 for af, socktype, proto, canonname, sa
in infos:
220 addr, port, family=af, type=socktype, proto=proto
222 sock_port = sock.getsockname()[1]
225 assert port == sock_port