Mercurial > projects > dreactor
comparison dreactor/protocol/RawTcp.d @ 5:f875a1f278b8
housekeeping
author | rick@minifunk |
---|---|
date | Tue, 08 Jul 2008 12:16:07 -0400 |
parents | f8b01c9f7114 |
children | 287ba7de97c4 |
comparison
equal
deleted
inserted
replaced
4:f8b01c9f7114 | 5:f875a1f278b8 |
---|---|
6 import tango.util.collection.CircularSeq; | 6 import tango.util.collection.CircularSeq; |
7 import tango.util.log.Log; | 7 import tango.util.log.Log; |
8 import tango.util.log.Config; | 8 import tango.util.log.Config; |
9 | 9 |
10 import dreactor.transport.AsyncSocketConduit; | 10 import dreactor.transport.AsyncSocketConduit; |
11 import dreactor.core.SelectLoop; | 11 import dreactor.core.Vat; |
12 import dreactor.core.ConnectionHandler; | 12 import dreactor.core.ConnectionHandler; |
13 | 13 |
14 /****************************************************************************** | 14 /****************************************************************************** |
15 | 15 |
16 Basic TCP server or client routines for sending raw data. | 16 Basic TCP server or client routines for sending raw data. |
18 ******************************************************************************/ | 18 ******************************************************************************/ |
19 class RawTCPListener | 19 class RawTCPListener |
20 { | 20 { |
21 public | 21 public |
22 Logger log; | 22 Logger log; |
23 this(ConnectionHandler mgr, SelectLoop sel, IPv4Address addr) | 23 this(ConnectionHandler mgr, Vat sel, IPv4Address addr) |
24 { | 24 { |
25 manager = mgr; | 25 manager = mgr; |
26 mgr.events(Event.Read); | 26 mgr.events(Event.Read); |
27 mgr.setOutgoingHandler(&Handlers.onSend); | 27 mgr.setOutgoingHandler(&Handlers.onSend); |
28 mgr.setIncomingHandler(&Handlers.onReceive); | 28 mgr.setIncomingHandler(&Handlers.onReceive); |
29 mgr.setConnectHandler(&accept); | 29 mgr.setConnectHandler(&accept); |
30 mgr.listen(addr); | 30 mgr.listen(addr); |
31 | 31 |
32 sel.addConnection(mgr); | 32 sel.addConnection(mgr); |
33 select = sel; | 33 vat = sel; |
34 log = Log.lookup("dreactor.protocol.RawTcpServer"); | 34 log = Log.lookup("dreactor.protocol.RawTcpServer"); |
35 log.info("log initialized"); | 35 log.info("log initialized"); |
36 children = new CircularSeq!(ConnectionHandler); | 36 children = new CircularSeq!(ConnectionHandler); |
37 } | 37 } |
38 | 38 |
40 { | 40 { |
41 AsyncSocketConduit newcond = new AsyncSocketConduit; | 41 AsyncSocketConduit newcond = new AsyncSocketConduit; |
42 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket); | 42 (cast(AsyncSocketConduit)cond).socket().accept(newcond.socket); |
43 ConnectionHandler h = ConnectionHandler.New(newcond, manager); | 43 ConnectionHandler h = ConnectionHandler.New(newcond, manager); |
44 h.events(Event.Read); | 44 h.events(Event.Read); |
45 select.addConnection(h); | 45 vat.addConnection(h); |
46 children.append(h); | 46 children.append(h); |
47 log.info("accepted new connection"); | 47 log.info("accepted new connection"); |
48 return 0; | 48 return 0; |
49 } | 49 } |
50 | 50 |
53 foreach(ConnectionHandler h; children) | 53 foreach(ConnectionHandler h; children) |
54 { | 54 { |
55 if (h.appendOutBuffer(outbuf)) | 55 if (h.appendOutBuffer(outbuf)) |
56 { | 56 { |
57 h.addEvent(Event.Write); | 57 h.addEvent(Event.Write); |
58 select.addConnection(h); | 58 vat.addConnection(h); |
59 } | 59 } |
60 } | 60 } |
61 return 0; | 61 return 0; |
62 } | 62 } |
63 | 63 |
66 | 66 |
67 } | 67 } |
68 | 68 |
69 private | 69 private |
70 ConnectionHandler manager; | 70 ConnectionHandler manager; |
71 SelectLoop select; | 71 Vat vat; |
72 CircularSeq!(ConnectionHandler) children; | 72 CircularSeq!(ConnectionHandler) children; |
73 } | 73 } |
74 | 74 |
75 class RawTCPClient | 75 class RawTCPClient |
76 { | 76 { |
77 public | 77 public |
78 Logger log; | 78 Logger log; |
79 this(ConnectionHandler mgr, SelectLoop sel, Event evts = Event.Read) | 79 this(ConnectionHandler mgr, Vat sel, Event evts = Event.Read) |
80 { | 80 { |
81 manager = mgr; | 81 manager = mgr; |
82 manager.events(evts); | 82 manager.events(evts); |
83 connected = false; | 83 connected = false; |
84 mgr.setOutgoingHandler(&Handlers.onSend); | 84 mgr.setOutgoingHandler(&Handlers.onSend); |
85 mgr.setIncomingHandler(&Handlers.onReceive); | 85 mgr.setIncomingHandler(&Handlers.onReceive); |
86 select = sel; | 86 vat = sel; |
87 log = Log.lookup("dreactor.protocol.RawTcpClient"); | 87 log = Log.lookup("dreactor.protocol.RawTcpClient"); |
88 } | 88 } |
89 | 89 |
90 int connect(IPv4Address addr) | 90 int connect(IPv4Address addr) |
91 { | 91 { |
92 (cast(AsyncSocketConduit) manager.transport()).connect(addr); | 92 (cast(AsyncSocketConduit) manager.transport()).connect(addr); |
93 select.addConnection(manager); | 93 vat.addConnection(manager); |
94 connected = true; | 94 connected = true; |
95 log.info("connected to {}", addr); | 95 log.info("connected to {}", addr); |
96 return 0; | 96 return 0; |
97 } | 97 } |
98 | 98 |
104 data as the socket becomes free. | 104 data as the socket becomes free. |
105 | 105 |
106 **************************************************************************/ | 106 **************************************************************************/ |
107 int send(char[] outbuf, IPv4Address addr = null) | 107 int send(char[] outbuf, IPv4Address addr = null) |
108 { | 108 { |
109 log.info("sending buffer: {}", outbuf); | |
110 if (!connected) | 109 if (!connected) |
111 { | 110 { |
112 log.info("not connected, connecting"); | 111 log.info("send: not connected, connecting"); |
113 if (addr !is null) | 112 if (addr !is null) |
114 { | 113 { |
115 if (0 > connect(addr)) | 114 if (0 > connect(addr)) |
116 { | 115 { |
117 log.error("unable to connect"); | 116 log.error("send: unable to connect"); |
118 return -1; | 117 return -1; |
119 } | 118 } |
120 } | 119 } |
121 } | 120 } |
122 if (manager.appendOutBuffer(outbuf)) | 121 if (manager.appendOutBuffer(outbuf)) |
123 { | 122 { |
124 manager.addEvent(Event.Write); | 123 manager.addEvent(Event.Write); |
125 if (!select.addConnection(manager)) | 124 if (!vat.addConnection(manager)) |
126 { | 125 { |
127 log.error("unable to register mgr"); | 126 log.error("unable to register mgr"); |
128 } | 127 } |
129 } | 128 } |
130 return 0; | 129 return 0; |
131 } | 130 } |
132 | 131 |
133 private | 132 private |
134 ConnectionHandler manager; | 133 ConnectionHandler manager; |
135 SelectLoop select; | 134 Vat vat; |
136 bool connected; | 135 bool connected; |
137 } | 136 } |
138 | 137 |
139 | 138 |
140 /****************************************************************************** | 139 /****************************************************************************** |
198 Logger log = Log.lookup("Handlers.onReceive"); | 197 Logger log = Log.lookup("Handlers.onReceive"); |
199 | 198 |
200 char inbuf[8192]; | 199 char inbuf[8192]; |
201 int amt; | 200 int amt; |
202 if((amt = h.transport.read(inbuf)) > 0) | 201 if((amt = h.transport.read(inbuf)) > 0) |
203 log.info("Received Buffer: {}", inbuf[0 .. amt]); | 202 log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]); |
204 else | 203 else |
205 log.error("Received no data, err = {}", amt); | 204 log.error("Received no data, err = {}", amt); |
206 | 205 |
207 return REMAIN; | 206 return REMAIN; |
208 } | 207 } |