diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2012-08-03 00:26:40 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2012-08-03 00:26:40 +0100 |
commit | 9c8b76dbd2743ffbaf96b7fb51ada8760ee2ea77 (patch) | |
tree | 59a310d435ec754c76bf1c12c0ec61538a1ee378 | |
parent | 12bc0419da773922a2d952c368bdaa34cf078ecd (diff) | |
download | Nim-9c8b76dbd2743ffbaf96b7fb51ada8760ee2ea77.tar.gz |
UDP sockets should now work with asyncio.
-rw-r--r-- | lib/pure/asyncio.nim | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/pure/asyncio.nim b/lib/pure/asyncio.nim index 2ac03061c..e5808baaf 100644 --- a/lib/pure/asyncio.nim +++ b/lib/pure/asyncio.nim @@ -101,9 +101,10 @@ type lineBuffer: TaintedString ## Temporary storage for ``recvLine`` sslNeedAccept: bool + proto: TProtocol TInfo* = enum - SockIdle, SockConnecting, SockConnected, SockListening, SockClosed + SockIdle, SockConnecting, SockConnected, SockListening, SockClosed, SockUDPBound TMode* = enum MReadable, MWriteable, MReadWrite @@ -136,6 +137,7 @@ proc AsyncSocket*(domain: TDomain = AF_INET, typ: TType = SOCK_STREAM, userArg: PObject = nil, buffered = true): PAsyncSocket = result = newAsyncSocket(userArg) result.socket = socket(domain, typ, protocol, buffered) + result.proto = protocol if result.socket == InvalidSocket: OSError() result.socket.setBlocking(false) @@ -201,6 +203,8 @@ proc close*(sock: PAsyncSocket) = proc bindAddr*(sock: PAsyncSocket, port = TPort(0), address = "") = ## Equivalent to ``sockets.bindAddr``. sock.socket.bindAddr(port, address) + if sock.proto == IPPROTO_UDP: + sock.info = SockUDPBound proc listen*(sock: PAsyncSocket) = ## Equivalent to ``sockets.listen``. @@ -360,7 +364,7 @@ proc poll*(d: PDispatcher, timeout: int = 500): bool = template deleg: expr = d.delegates[dc] let aSock = deleg.getSocket(deleg.deleVal) if (deleg.mode != MWriteable and aSock.info == SockConnected) or - aSock.info == SockListening: + aSock.info == SockListening or aSock.info == SockUDPBound: readSocks.add(aSock.sock) if aSock.info == SockConnecting or (aSock.info == SockConnected and deleg.mode != MReadable): @@ -381,7 +385,8 @@ proc poll*(d: PDispatcher, timeout: int = 500): bool = if i > len(d.delegates)-1: break # One delegate might've been removed. let deleg = d.delegates[i] let sock = deleg.getSocket(deleg.deleVal) - if sock.info == SockConnected: + if sock.info == SockConnected or + sock.info == SockUDPBound: if deleg.mode != MWriteable and sock.sock notin readSocks: if not (sock.info == SockConnecting): assert(not (sock.info == SockListening)) |