kopia lustrzana https://github.com/micropython/micropython-lib
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
rodzic
057b0ba4c4
commit
916e15ed35
|
@ -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()
|
||||
|
|
Ładowanie…
Reference in New Issue