uasyncio.udp: Initial attempt of UDP support for uasyncio.

API is not stable and will guaranteedly change, likely completely.

Currently, this tries to folow the same idea as TCP open_connection()
call, but that doesn't make much sense, so that will likely change.
pull/234/merge
Paul Sokolovsky 2017-12-03 00:07:12 +02:00
rodzic ec7a9a1f20
commit d87573b113
1 zmienionych plików z 78 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,78 @@
import uerrno
import usocket
from uasyncio.core import *
DEBUG = 0
log = None
def set_debug(val):
global DEBUG, log
DEBUG = val
if 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)
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