annotate dreactor/transport/AsyncSocketConduit.d @ 13:8c9b1276f623 default tip

bug fixes
author rick@minifunk
date Sat, 20 Sep 2008 18:33:11 -0400
parents d6a3cfe7c3de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
1 /*******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
5 license: BSD style: $(LICENSE)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
7 version: Mar 2004 : Initial release
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
8 version: Jan 2005 : RedShodan patch for timeout query
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
9 version: Dec 2006 : Outback release
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
11 author: Kris, modified by Rick Richardson (May 2008)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
12
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
13 *******************************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15 module dreactor.transport.AsyncSocketConduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17 private import tango.time.Time;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18
12
d6a3cfe7c3de more stuff
rick@Macintosh.local
parents: 3
diff changeset
19 public import tango.io.device.Conduit;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 private import tango.net.Socket;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
23 /*******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
24
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
25 A wrapper around the bare Socket to implement the IConduit abstraction
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
26 and add socket-specific functionality specifically for multiplexing via
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
27 poll and the ilk.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
28
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
29 AsyncSocketConduit data-transfer is typically performed in conjunction with
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
30 an IBuffer, but can happily be handled directly using void array where
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
31 preferred
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
32
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
33 *******************************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35 class AsyncSocketConduit : Conduit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
36 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
37 package Socket socket_;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
39 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
40
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
41 Create a streaming Internet Socket
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
43 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
45 this ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
46 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
47 this (SocketType.STREAM, ProtocolType.TCP);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
48 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
49
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
50 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
51
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
52 Create an Internet Socket. Used by subclasses and by
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
53 ServerSocket; the latter via method allocate() below
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
54
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
55 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
57 protected this (SocketType type, ProtocolType protocol, bool create=true)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
58 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
59 socket_ = new Socket (AddressFamily.INET, type, protocol, create);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
60 socket_.blocking(false);
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
61 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
63 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
65 Return the name of this device
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
67 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
69 override char[] toString()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
70 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
71 return socket.toString;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
72 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
74 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
75
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
76 Return the socket wrapper
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
78 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
80 Socket socket ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
81 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
82 return socket_;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
83 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
85 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
86
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
87 Return a preferred size for buffering conduit I/O
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
89 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
91 override uint bufferSize ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
92 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
93 return 1024 * 8;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
94 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
95
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
96 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
98 Models a handle-oriented device.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
99
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
100 TODO: figure out how to avoid exposing this in the general
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
101 case
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
103 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104
13
8c9b1276f623 bug fixes
rick@minifunk
parents: 12
diff changeset
105 Handle fileHandle ()
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
106 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
107 return cast(Handle) socket_.fileHandle;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
108 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
110 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
111
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
112 Is this socket still alive?
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
113
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
114 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
116 override bool isAlive ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
117 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
118 return socket_.isAlive;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
119 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
120
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
121 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
123 Connect to the provided endpoint
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
125 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
126
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
127 AsyncSocketConduit connect (Address addr)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
128 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
129 socket_.connect (addr);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
130 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
131 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
132
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
133 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
134
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
135 Bind the socket. This is typically used to configure a
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
136 listening socket (such as a server or multicast socket).
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
137 The address given should describe a local adapter, or
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
138 specify the port alone (ADDR_ANY) to have the OS assign
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
139 a local adapter address.
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
140
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
141 ***********************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
142
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
143 AsyncSocketConduit bind (Address address)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
144 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
145 socket_.bind (address);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
146 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
147 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
148
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
149 /**************************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
150
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
151 Enable the socket for listening
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
152
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
153 **************************************************************************/
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
154 AsyncSocketConduit listen(int backlog = 255)
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
155 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
156 socket_.listen(backlog);
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
157 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
158 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
159
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
160 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
161
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
162 Inform other end of a connected socket that we're no longer
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
163 available. In general, this should be invoked before close()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
164 is invoked
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
165
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
166 The shutdown function shuts down the connection of the socket:
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
167
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
168 - stops receiving data for this socket. If further data
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
169 arrives, it is rejected.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
170
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
171 - stops trying to transmit data from this socket. Also
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
172 discards any data waiting to be sent. Stop looking for
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
173 acknowledgement of data already sent; don't retransmit
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
174 if any data is lost.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
175
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
176 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
177
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
178 AsyncSocketConduit shutdown ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
179 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
180 socket_.shutdown (SocketShutdown.BOTH);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
181 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
182 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
183
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
184 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
185
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
186 Release this AsyncSocketConduit
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
187
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
188 Note that one should always disconnect a AsyncSocketConduit
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
189 under normal conditions, and generally invoke shutdown
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
190 on all connected sockets beforehand
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
191
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
192 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
193
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
194 override void detach ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
195 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
196 socket_.detach;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
197 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
198
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
199 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
200
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
201 Read content from the socket.
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
202
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
203 Returns the number of bytes read from the socket, or
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
204 IConduit.Eof where there's no more content available
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
205
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
206 Return IConduit.Eof if there is an error with the socket.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
207
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
208 ***********************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
209 override uint read (void[] dst)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
210 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
211 // invoke the actual read op
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
212 return socket_.receive(dst);
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
213 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
214
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
215
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
216 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
217
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
218 Callback routine to write the provided content to the
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
219 socket.
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
220 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
221
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
222 override uint write (void[] src)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
223 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
224 return socket_.send (src);
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
225 }
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
226 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
227