annotate dreactor/protocol/RawTcp.d @ 6:287ba7de97c4

more housekeeping
author rick@minifunk
date Tue, 08 Jul 2008 12:23:26 -0400
parents f875a1f278b8
children 60cf25102fb2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
1 module dreactor.protocol.RawTcp;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
2
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
3 import tango.io.Conduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
4 import tango.io.selector.model.ISelector;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
5 import tango.net.Socket;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
6 import tango.util.collection.CircularSeq;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
7 import tango.util.log.Log;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
8 import tango.util.log.Config;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
9
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
10 import dreactor.transport.AsyncSocketConduit;
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
11 import dreactor.core.Vat;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
12 import dreactor.core.Dispatcher;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
13
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
14 /******************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
15
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
16 Basic TCP server or client routines for sending raw data.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
17
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
18 ******************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
19 class RawTCPListener
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
20 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
21 public
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
22 Logger log;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
23 this(Dispatcher mgr, Vat sel, IPv4Address addr)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
24 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
25 manager = mgr;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
26 mgr.events(Event.Read);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
27 mgr.setOutgoingHandler(&Handlers.onSend);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
28 mgr.setIncomingHandler(&Handlers.onReceive);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
29 mgr.setConnectHandler(&accept);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
30 mgr.listen(addr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
31
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
32 sel.addConnection(mgr);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
33 vat = sel;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
34 log = Log.lookup("dreactor.protocol.RawTcpServer");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
35 log.info("log initialized");
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
36 children = new CircularSeq!(Dispatcher);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
37 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
38
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
39 int accept(Conduit cond, RegisterD reg)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
40 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
41 AsyncSocketConduit newcond = new AsyncSocketConduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
42 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket);
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
43 Dispatcher h = Dispatcher.New(newcond, manager);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
44 h.events(Event.Read);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
45 vat.addConnection(h);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
46 children.append(h);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
47 log.info("accepted new connection");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
48 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
49 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
50
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
51 int broadcast(char[] outbuf)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
52 {
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
53 foreach(Dispatcher h; children)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
54 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
55 if (h.appendOutBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
56 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
57 h.addEvent(Event.Write);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
58 vat.addConnection(h);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
59 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
60 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
61 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
62 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
63
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
64 void close()
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
65 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
66
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
67 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
68
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
69 private
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
70 Dispatcher manager;
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
71 Vat vat;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
72 CircularSeq!(Dispatcher) children;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
73 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
74
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
75 class RawTCPClient
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
76 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
77 public
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
78 Logger log;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
79 this(Dispatcher mgr, Vat sel, Event evts = Event.Read)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
80 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
81 manager = mgr;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
82 manager.events(evts);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
83 connected = false;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
84 mgr.setOutgoingHandler(&Handlers.onSend);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
85 mgr.setIncomingHandler(&Handlers.onReceive);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
86 vat = sel;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
87 log = Log.lookup("dreactor.protocol.RawTcpClient");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
88 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
89
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
90 int connect(IPv4Address addr)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
91 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
92 (cast(AsyncSocketConduit) manager.transport()).connect(addr);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
93 vat.addConnection(manager);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
94 connected = true;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
95 log.info("connected to {}", addr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
96 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
97 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
98
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
99 /**************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
100
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
101 send
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
102 User-called function to send data to the counterpart at the other
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
103 end of the connection. This sets up the connection manager to send
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
104 data as the socket becomes free.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
105
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
106 **************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
107 int send(char[] outbuf, IPv4Address addr = null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
108 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
109 if (!connected)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
110 {
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
111 log.info("send: not connected, connecting");
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
112 if (addr !is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
113 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
114 if (0 > connect(addr))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
115 {
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
116 log.error("send: unable to connect");
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
117 return -1;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
118 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
119 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
120 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
121 if (manager.appendOutBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
122 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
123 manager.addEvent(Event.Write);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
124 if (!vat.addConnection(manager))
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
125 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
126 log.error("unable to register mgr");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
127 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
128 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
129 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
130 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
131
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
132 private
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
133 Dispatcher manager;
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
134 Vat vat;
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
135 bool connected;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
136 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
137
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
138
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
139 /******************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
140
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
141 Default Event handlers common to both listener/clients
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
142
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
143 ******************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
144 class Handlers
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
145 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
146 /**************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
147
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
148 onSend
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
149 OutgoingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
150 To be registered as the response to socket writable event.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
151 Sends data, returns amount sent. Unregisters Handler for sending
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
152 if there is no more data left to send.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
153
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
154 ***************************************************************************/
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
155 public static int onSend(Dispatcher h)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
156 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
157 Logger log = Log.lookup("Handlers.onSend");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
158
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
159 log.info("top of onSend");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
160 char[] outbuf = h.nextBuffer();
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
161 if (outbuf !is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
162 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
163 int sent = h.transport.write(outbuf);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
164 if (sent > 0)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
165 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
166 if (! h.addOffset(sent))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
167 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
168 h.remEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
169 return REREGISTER;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
170 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
171 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
172 else if (sent == AsyncSocketConduit.Eof)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
173 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
174 log.error("Select said socket was writable, but sent 0 bytes");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
175 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
176 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
177 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
178 log.error("Socket send return ERR");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
179 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
180 return REMAIN;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
181 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
182 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
183 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
184 h.remEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
185 return REREGISTER;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
186 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
187 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
188 /**************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
189
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
190 receive
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
191 IncomingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
192 Default incoming data handler. Should be replaced with something useful.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
193
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
194 **************************************************************************/
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
195 public static int onReceive(Dispatcher h)
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
196 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
197 Logger log = Log.lookup("Handlers.onReceive");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
198
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
199 char inbuf[8192];
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
200 int amt;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
201 if((amt = h.transport.read(inbuf)) > 0)
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 4
diff changeset
202 log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]);
4
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
203 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
204 log.error("Received no data, err = {}", amt);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
205
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
206 return REMAIN;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
207 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
208 }