summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2012-08-03 00:26:40 +0100
committerDominik Picheta <dominikpicheta@googlemail.com>2012-08-03 00:26:40 +0100
commit9c8b76dbd2743ffbaf96b7fb51ada8760ee2ea77 (patch)
tree59a310d435ec754c76bf1c12c0ec61538a1ee378
parent12bc0419da773922a2d952c368bdaa34cf078ecd (diff)
downloadNim-9c8b76dbd2743ffbaf96b7fb51ada8760ee2ea77.tar.gz
UDP sockets should now work with asyncio.
-rw-r--r--lib/pure/asyncio.nim11
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))