diff dreactor/protocol/RawTcp.d @ 9:5412a1ff2e49

adding chat client and more updates
author rick@minifunk
date Sat, 12 Jul 2008 10:42:41 -0400
parents 60cf25102fb2
children e75a2e506b1d
line wrap: on
line diff
--- a/dreactor/protocol/RawTcp.d	Wed Jul 09 00:56:21 2008 -0400
+++ b/dreactor/protocol/RawTcp.d	Sat Jul 12 10:42:41 2008 -0400
@@ -30,7 +30,7 @@
         mgr.setErrorHandler(&onError);
         mgr.setDisconnectHandler(&onHangup);
         mgr.listen(addr);
-        
+         
         sel.addConnection(mgr);
         vat = sel;
         log = Log.lookup("dreactor.protocol.RawTcpServer");
@@ -40,10 +40,22 @@
     this(Vat sel, IPv4Address addr)
     {
         AsyncSocketConduit cond = new AsyncSocketConduit;
+        cond.socket().setAddressReuse(true);
         Dispatcher lh = new Dispatcher(cond, true);
         this(lh, sel, addr);
     }
- 
+
+    ~this()
+    {
+        foreach(Dispatcher d; children)
+        {
+            (cast(AsyncSocketConduit)d.transport).shutdown();
+            (cast(AsyncSocketConduit)d.transport).detach();
+        }
+        (cast(AsyncSocketConduit)manager.transport).shutdown();
+        (cast(AsyncSocketConduit)manager.transport).detach(); 
+    } 
+
     int accept(Conduit cond, RegisterD reg)
     {
         AsyncSocketConduit newcond = new AsyncSocketConduit;
@@ -56,7 +68,7 @@
         return 0;
     }
 
-    int broadcast(char[] outbuf, Dispatcher[] excluded)
+    int broadcast(char[] outbuf, Dispatcher[] excluded = null)
     {
         foreach(Dispatcher h; children)
         {
@@ -70,6 +82,28 @@
         }
         return 0;
     }
+    
+    /**************************************************************************
+    
+        send
+        User-called function to send data to the counterpart at the other
+        end of the connection. This sets up the connection manager to send
+        data as the socket becomes free. 
+
+    **************************************************************************/
+    int send(Dispatcher d, char[] outbuf, IPv4Address addr = null)
+    {
+        if (d.appendOutBuffer(outbuf))
+        {
+            d.addEvent(Event.Write);
+            d.setOutgoingHandler(&onSend);
+            if (!vat.addConnection(d))
+            {
+                log.error("unable to register mgr");
+            }
+        }
+        return 0;
+    }
 
     public int onReceive(Dispatcher h)
     {
@@ -89,6 +123,7 @@
             if (amt == 0)
             {
                 children.remove(h);
+                (cast(AsyncSocketConduit) h.transport).shutdown();
                 return CLOSE;
             }
             log.error("Received no data, err = {}", amt);
@@ -123,6 +158,7 @@
         vat = sel;
         log = Log.lookup("dreactor.protocol.RawTcpClient");
     }
+
     this(Vat sel, Event evts = Event.Read)
     {
         AsyncSocketConduit clcond = new AsyncSocketConduit;
@@ -130,6 +166,12 @@
         this(ch, sel, evts);
     }
 
+    ~this()
+    {
+        (cast(AsyncSocketConduit)manager.transport).shutdown();
+        (cast(AsyncSocketConduit)manager.transport).detach();
+    }
+
     int connect(IPv4Address addr)
     {
         (cast(AsyncSocketConduit) manager.transport()).connect(addr);
@@ -199,7 +241,6 @@
 {
     Logger log = Log.lookup("Handlers.onSend");
  
-    log.info("top of onSend");
     char[] outbuf = h.nextBuffer();
     if (outbuf !is null)
     {