From 916e15ed3559e7dfd52a36f59c4dea7110acdfab Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 16 Dec 2017 00:40:03 +0200 Subject: [PATCH] uasyncio.udp: New functional API, mimicking socket module. Don't have any wrapper classes for UDP socket, instead just have top-level coroutines, taking raw socket as an argument: s.recv(1500) => await uasyncio.udp.recv(s, 1500) --- uasyncio.udp/uasyncio/udp.py | 107 ++++++++++++++--------------------- 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/uasyncio.udp/uasyncio/udp.py b/uasyncio.udp/uasyncio/udp.py index 29a05bde..2de38957 100644 --- a/uasyncio.udp/uasyncio/udp.py +++ b/uasyncio.udp/uasyncio/udp.py @@ -1,6 +1,5 @@ -import uerrno import usocket -from uasyncio.core import * +from uasyncio import core DEBUG = 0 @@ -13,66 +12,46 @@ def set_debug(val): import logging log = logging.getLogger("uasyncio.udp") - -class UdpSocket: - - def __init__(self, s): - self.s = s - - def recv(self, n): - try: - yield IORead(self.s) - return self.s.recv(n) - except: - #print("recv: exc, cleaning up") - #print(uasyncio.core._event_loop.objmap, uasyncio.core._event_loop.poller) - #uasyncio.core._event_loop.poller.dump() - yield IOReadDone(self.s) - #print(uasyncio.core._event_loop.objmap) - #uasyncio.core._event_loop.poller.dump() - raise - - def recvfrom(self, n): - try: - yield IORead(self.s) - return self.s.recvfrom(n) - except: - #print("recv: exc, cleaning up") - #print(uasyncio.core._event_loop.objmap, uasyncio.core._event_loop.poller) - #uasyncio.core._event_loop.poller.dump() - yield IOReadDone(self.s) - #print(uasyncio.core._event_loop.objmap) - #uasyncio.core._event_loop.poller.dump() - raise - - def asendto(self, buf, addr=None): - while 1: - res = self.s.sendto(buf, 0, addr) - #print("send res:", res) - if res == len(buf): - return - print("asento: IOWrite") - yield IOWrite(self.s) - - def aclose(self): - yield IOReadDone(self.s) - self.s.close() - - -def udp_socket(host=None, port=None): - if DEBUG and __debug__: - log.debug("udp_socket(%s, %s)", host, port) - s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM) +def socket(af=usocket.AF_INET): + s = usocket.socket(af, usocket.SOCK_DGRAM) s.setblocking(False) - if host and port: - ai = usocket.getaddrinfo(host, port) - addr = ai[0][-1] - try: - s.connect(addr) - except OSError as e: - if e.args[0] != uerrno.EINPROGRESS: - raise - if DEBUG and __debug__: - log.debug("udp_socket: After connect") - return UdpSocket(s) - yield + return s + +def recv(s, n): + try: + yield core.IORead(s) + return s.recv(n) + except: + #print("recv: exc, cleaning up") + #print(uasyncio.core._event_loop.objmap, uasyncio.core._event_loop.poller) + #uasyncio.core._event_loop.poller.dump() + yield core.IOReadDone(s) + #print(uasyncio.core._event_loop.objmap) + #uasyncio.core._event_loop.poller.dump() + raise + +def recvfrom(s, n): + try: + yield core.IORead(s) + return s.recvfrom(n) + except: + #print("recv: exc, cleaning up") + #print(uasyncio.core._event_loop.objmap, uasyncio.core._event_loop.poller) + #uasyncio.core._event_loop.poller.dump() + yield core.IOReadDone(s) + #print(uasyncio.core._event_loop.objmap) + #uasyncio.core._event_loop.poller.dump() + raise + +def sendto(s, buf, addr=None): + while 1: + res = s.sendto(buf, 0, addr) + #print("send res:", res) + if res == len(buf): + return + print("asento: IOWrite") + yield core.IOWrite(s) + +def close(s): + yield core.IOReadDone(s) + s.close()