annotate dreactor/protocol/RawTcp.d @ 4:f8b01c9f7114

adding basic protocols
author rick@minifunk
date Tue, 08 Jul 2008 11:22:39 -0400
parents
children f875a1f278b8
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;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
11 import dreactor.core.SelectLoop;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
12 import dreactor.core.ConnectionHandler;
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;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
23 this(ConnectionHandler mgr, SelectLoop sel, IPv4Address addr)
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);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
33 select = sel;
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");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
36 children = new CircularSeq!(ConnectionHandler);
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);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
43 ConnectionHandler h = ConnectionHandler.New(newcond, manager);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
44 h.events(Event.Read);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
45 select.addConnection(h);
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 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
53 foreach(ConnectionHandler h; children)
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);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
58 select.addConnection(h);
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
70 ConnectionHandler manager;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
71 SelectLoop select;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
72 CircularSeq!(ConnectionHandler) children;
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;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
79 this(ConnectionHandler mgr, SelectLoop sel, Event evts = Event.Read)
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);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
86 select = sel;
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);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
93 select.addConnection(manager);
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 log.info("sending buffer: {}", outbuf);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
110 if (!connected)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
111 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
112 log.info("not connected, connecting");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
113 if (addr !is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
114 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
115 if (0 > connect(addr))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
116 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
117 log.error("unable to connect");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
118 return -1;
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 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
122 if (manager.appendOutBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
123 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
124 manager.addEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
125 if (!select.addConnection(manager))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
126 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
127 log.error("unable to register mgr");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
128 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
129 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
130 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
131 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
132
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
133 private
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
134 ConnectionHandler manager;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
135 SelectLoop select;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
136 bool connected;
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
142 Default Event handlers common to both listener/clients
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
143
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
144 ******************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
145 class Handlers
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
149 onSend
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
150 OutgoingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
151 To be registered as the response to socket writable event.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
152 Sends data, returns amount sent. Unregisters Handler for sending
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
153 if there is no more data left to send.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
154
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
155 ***************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
156 public static int onSend(ConnectionHandler h)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
157 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
158 Logger log = Log.lookup("Handlers.onSend");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
159
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
160 log.info("top of onSend");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
161 char[] outbuf = h.nextBuffer();
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
162 if (outbuf !is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
163 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
164 int sent = h.transport.write(outbuf);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
165 if (sent > 0)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
166 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
167 if (! h.addOffset(sent))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
168 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
169 h.remEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
170 return REREGISTER;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
171 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
172 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
173 else if (sent == AsyncSocketConduit.Eof)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
174 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
175 log.error("Select said socket was writable, but sent 0 bytes");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
176 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
177 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
178 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
179 log.error("Socket send return ERR");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
180 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
181 return REMAIN;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
182 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
183 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
184 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
185 h.remEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
186 return REREGISTER;
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
191 receive
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
192 IncomingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
193 Default incoming data handler. Should be replaced with something useful.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
194
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
195 **************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
196 public static int onReceive(ConnectionHandler h)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
197 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
198 Logger log = Log.lookup("Handlers.onReceive");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
199
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
200 char inbuf[8192];
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
201 int amt;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
202 if((amt = h.transport.read(inbuf)) > 0)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
203 log.info("Received Buffer: {}", inbuf[0 .. amt]);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
204 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
205 log.error("Received no data, err = {}", amt);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
206
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
207 return REMAIN;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
208 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
209 }