diff --git a/extmod/uasyncio/stream.py b/extmod/uasyncio/stream.py index 3a68881da3..8de2d2599f 100644 --- a/extmod/uasyncio/stream.py +++ b/extmod/uasyncio/stream.py @@ -107,15 +107,7 @@ class Server: async def wait_closed(self): await self.task - async def _serve(self, cb, host, port, backlog): - import usocket as socket - - ai = socket.getaddrinfo(host, port)[0] # TODO this is blocking! - s = socket.socket() - s.setblocking(False) - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(ai[-1]) - s.listen(backlog) + async def _serve(self, s, cb): # Accept incoming connections while True: try: @@ -137,9 +129,20 @@ class Server: # Helper function to start a TCP stream server, running as a new task # TODO could use an accept-callback on socket read activity instead of creating a task async def start_server(cb, host, port, backlog=5): - s = Server() - s.task = core.create_task(s._serve(cb, host, port, backlog)) - return s + import usocket as socket + + # Create and bind server socket. + host = socket.getaddrinfo(host, port)[0] # TODO this is blocking! + s = socket.socket() + s.setblocking(False) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(host[-1]) + s.listen(backlog) + + # Create and return server object and task. + srv = Server() + srv.task = core.create_task(srv._serve(s, cb)) + return srv ################################################################################ diff --git a/tests/net_hosted/uasyncio_start_server.py b/tests/net_hosted/uasyncio_start_server.py new file mode 100644 index 0000000000..f13402979f --- /dev/null +++ b/tests/net_hosted/uasyncio_start_server.py @@ -0,0 +1,31 @@ +# Test basic behaviour of uasyncio.start_server() + +try: + import uasyncio as asyncio +except ImportError: + try: + import asyncio + except ImportError: + print("SKIP") + raise SystemExit + + +async def test(): + # Test creating 2 servers using the same address + print("create server1") + server1 = await asyncio.start_server(None, "0.0.0.0", 8000) + try: + print("create server2") + await asyncio.start_server(None, "0.0.0.0", 8000) + except OSError as er: + print("OSError") + + # Wait for server to close. + async with server1: + print("sleep") + await asyncio.sleep(0) + + print("done") + + +asyncio.run(test()) diff --git a/tests/net_hosted/uasyncio_start_server.py.exp b/tests/net_hosted/uasyncio_start_server.py.exp new file mode 100644 index 0000000000..0fb8e6a63b --- /dev/null +++ b/tests/net_hosted/uasyncio_start_server.py.exp @@ -0,0 +1,5 @@ +create server1 +create server2 +OSError +sleep +done