annotate asyncdreactor/protocol/RawUdp.d @ 11:5836613d16ac

reorg! reorg!
author rick@minifunk
date Tue, 12 Aug 2008 16:59:56 -0400
parents dreactor/protocol/RawUdp.d@f8b01c9f7114
children
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.Raw;
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 dreactor.core.AsyncConduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
6 import dreactor.core.SelectLoop;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
7 import dreactor.core.ConnectionHandler;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
8 import tango.util.collection.CircularSeq;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
9 import tango.util.log.Log;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
10 import tango.util.log.Configurator;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
11
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
12 Logger log = Log.getLogger("dreactor.core.SelectLoop");
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 RawListener
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
23 this(ConnectionHandler mgr, SelectLoop sel)
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 sel.addConnection(mgr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
28 select = sel;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
29 children = CircularSeq!(ConnectionHandler);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
30 Configurator();
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
31 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
32
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
33 int accept(Conduit cond)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
34 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
35 AsyncConduit newcond = new AsyncConduit;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
36 cond.socket().accept(newcond.socket);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
37 ConnectionHandler h = ConnectionHandler.New(manager);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
38 mgr.events(Event.Read);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
39 select.addConnection(mgr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
40 children.append(mgr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
41 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
42
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
43 bool broadcast(char[] outbuf)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
44 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
45 foreach(ConnectionHandler h; children)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
46 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
47 if (h.appendBuffer(outbuf))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
48 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
49 h.addEvent(Event.Write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
50 select.addConnection(h);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
51 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
52 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
53 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
54
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
55 void close()
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
56 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
57
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
58 }
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
62 send
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
63 OutgoingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
64 To be registered as the response to socket writable event.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
65 Sends data, returns amount sent. Unregisters Handler for sending
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
66 if there is no more data left to send.
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 int send(ConnectionHandler h, RegisterD reg)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
70 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
71 char[] outbuf = h.nextBuffer();
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
72 if (!outbuf is null)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
73 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
74 int sent = h.transport.write(outbuf);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
75 if (sent > 0)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
76 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
77 if (! h.addOffset(sent))
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
78 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
79 h.removeEvent(Event.write);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
80 reg(h);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
81 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
82 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
83 else if (sent == EOF)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
84 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
85 // EAGAIN ? probably shouldn't have happened.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
86 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
87 else
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
88 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
89 log.error("Socket send return ERR");
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
90 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
91 return sent;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
92 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
93 return 0;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
94 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
95
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
96 /**************************************************************************
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
97
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
98 receive
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
99 IncomingHandlerD
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
100 Default incoming data handler. Should be replaced with something useful.
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
101
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
102 **************************************************************************/
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
103 int receive(ConnectionHandler h, RegisterD reg)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
104 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
105 char inbuf[8192];
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
106 auto format = Log.format;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
107 if(h.transport.read(inbuf) > 0)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
108 log.info(format("Received Buffer: {}", inbuf));
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
109 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
110
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
111 private
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
112 ConnectionHandler manager;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
113 SelectLoop select;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
114 CircularSeq!(ConnectionHandler) children;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
115 }
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
116
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
117 class RawClient
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
118 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
119 public
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
120 this(ConnectionHandler mgr, SelectLoop sel)
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
121 {
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
122 manager = mgr;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
123 mgr.events(Event.Read);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
124 sel.addConnection(mgr);
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
125 select = sel;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
126 }
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
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
130 private
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
131 ConnectionHandler manager;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
132 SelectLoop select;
f8b01c9f7114 adding basic protocols
rick@minifunk
parents:
diff changeset
133 }