Mercurial > projects > dreactor
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) {