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)
pull/234/merge
Paul Sokolovsky 2017-12-16 00:40:03 +02:00
rodzic 057b0ba4c4
commit 916e15ed35
1 zmienionych plików z 43 dodań i 64 usunięć

Wyświetl plik

@ -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()