Merge lp:~eday/scalestack/network-review into lp:~registry/scalestack/old-trunk
- network-review
- Merge into old-trunk
Proposed by
Eric Day
Status: | Merged |
---|---|
Merged at revision: | 55 |
Proposed branch: | lp:~eday/scalestack/network-review |
Merge into: | lp:~registry/scalestack/old-trunk |
Diff against target: |
1791 lines (+472/-487) 32 files modified
ScaleStack/Echo/Flood/Datagram.cc (+16/-23) ScaleStack/Echo/Flood/Datagram.h (+14/-13) ScaleStack/Echo/Flood/Flood.h (+2/-8) ScaleStack/Echo/Flood/Stream.cc (+8/-12) ScaleStack/Echo/Flood/Stream.h (+11/-10) ScaleStack/Echo/Flood/TCP/TCP.cc (+2/-1) ScaleStack/Echo/Flood/UDP/Service.cc (+2/-7) ScaleStack/Echo/Flood/UDP/Service.h (+1/-3) ScaleStack/Echo/Flood/UDP/UDP.cc (+4/-8) ScaleStack/Echo/Flood/UnixStream/UnixStream.cc (+2/-1) ScaleStack/Echo/Flood/plugin.ini (+2/-2) ScaleStack/Echo/Server/Datagram.cc (+3/-10) ScaleStack/Echo/Server/Datagram.h (+8/-6) ScaleStack/Echo/Server/Stream.h (+3/-2) ScaleStack/Echo/Server/TCP/TCP.cc (+10/-0) ScaleStack/Echo/Server/UDP/Service.h (+1/-1) ScaleStack/Echo/Server/UDP/Test/Run.cc (+24/-9) ScaleStack/Echo/Server/UDP/UDP.cc (+2/-2) ScaleStack/Echo/Server/plugin.ini (+2/-2) ScaleStack/Network/Datagram.cc (+69/-51) ScaleStack/Network/Datagram.h (+88/-56) ScaleStack/Network/IP/Common.cc (+32/-45) ScaleStack/Network/IP/Common.h (+19/-22) ScaleStack/Network/IP/TCP/ConnectionService.cc (+5/-5) ScaleStack/Network/IP/TCP/ConnectionService.h (+2/-2) ScaleStack/Network/IP/UDP/Socket.cc (+1/-10) ScaleStack/Network/IP/UDP/SocketService.cc (+102/-112) ScaleStack/Network/IP/UDP/SocketService.h (+29/-55) ScaleStack/Network/StreamService.h (+4/-4) ScaleStack/Network/Unix/Stream/Connection.h (+1/-2) ScaleStack/Network/Unix/Stream/ConnectionService.h (+2/-2) ScaleStack/Network/Unix/Stream/Listener.h (+1/-1) |
To merge this branch: | bzr merge lp:~eday/scalestack/network-review |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Christopher Mooney (community) | Approve | ||
Review via email: mp+25390@code.launchpad.net |
Commit message
Description of the change
Network/UDP cleanup.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'ScaleStack/Echo/Flood/Datagram.cc' |
2 | --- ScaleStack/Echo/Flood/Datagram.cc 2010-05-04 08:58:05 +0000 |
3 | +++ ScaleStack/Echo/Flood/Datagram.cc 2010-05-16 06:24:29 +0000 |
4 | @@ -16,9 +16,9 @@ |
5 | #include "config.h" |
6 | |
7 | #include <cstring> |
8 | -#include <netdb.h> |
9 | |
10 | #include <ScaleStack/Echo/Flood/Datagram.h> |
11 | +#include <ScaleStack/Echo/Flood/Flood.h> |
12 | #include <ScaleStack/Kernel/Core.h> |
13 | #include <ScaleStack/Kernel/Module.h> |
14 | #include <ScaleStack/Kernel/Option.h> |
15 | @@ -28,25 +28,19 @@ |
16 | namespace Flood { |
17 | |
18 | /* |
19 | - * Public functions. |
20 | + * Public methods. |
21 | */ |
22 | |
23 | -void DatagramOptions(Kernel::Module& module) |
24 | +void Datagram::Options(Kernel::Module& module) |
25 | { |
26 | module.addOption("iterations", "Number of iterations to run per datagram, 0 means forever.", "COUNT", "1"); |
27 | - module.addOption("count", "Number of concurrent datagrams to open.", "COUNT", "1"); |
28 | - module.addOption("send_size", "Size of packets to send.", "SEND_SIZE", "4096"); |
29 | + module.addOption("packet_size", "Size of packets to send.", "SIZE", "4096"); |
30 | } |
31 | |
32 | -/* |
33 | - * Public methods. |
34 | - */ |
35 | - |
36 | -Datagram::Datagram(Network::DatagramService& service, struct addrinfo* send_addr): |
37 | +Datagram::Datagram(Network::DatagramService& service): |
38 | Network::Datagram(service), |
39 | - _send_addr(send_addr), |
40 | - _send_size(_module.getOption("send_size").getSizeValue()), |
41 | _iterations(_module.getOption("iterations").getSizeValue()), |
42 | + _packet_size(_module.getOption("packet_size").getSizeValue()), |
43 | _read_offset(), |
44 | _write_offset() |
45 | { |
46 | @@ -61,10 +55,10 @@ |
47 | flushSend(); |
48 | } |
49 | |
50 | -size_t Datagram::recv(uint8_t* buffer, size_t size, struct sockaddr*, socklen_t) |
51 | +size_t Datagram::receive(uint8_t* buffer, size_t size, struct sockaddr&, socklen_t) |
52 | { |
53 | if (memcmp(random_buffer + _read_offset, buffer, size)) |
54 | - _module.logFatal("Read data did not match what was sent"); |
55 | + _module.logFatal("Received data did not match what was sent"); |
56 | |
57 | _read_offset += size; |
58 | |
59 | @@ -88,15 +82,14 @@ |
60 | |
61 | void Datagram::flushSend(void) |
62 | { |
63 | - size_t send_size = _send_size; |
64 | - |
65 | - if (random_buffer_size - _write_offset < send_size) |
66 | - send_size = random_buffer_size - _write_offset; |
67 | - |
68 | - _write_offset += send(random_buffer + _write_offset, |
69 | - send_size, |
70 | - _send_addr->ai_addr, |
71 | - _send_addr->ai_addrlen); |
72 | + size_t packet_size; |
73 | + |
74 | + if (random_buffer_size - _write_offset < _packet_size) |
75 | + packet_size = random_buffer_size - _write_offset; |
76 | + else |
77 | + packet_size = _packet_size; |
78 | + |
79 | + _write_offset += send(random_buffer + _write_offset, packet_size); |
80 | } |
81 | |
82 | void Datagram::error(void) |
83 | |
84 | === modified file 'ScaleStack/Echo/Flood/Datagram.h' |
85 | --- ScaleStack/Echo/Flood/Datagram.h 2010-05-03 00:23:08 +0000 |
86 | +++ ScaleStack/Echo/Flood/Datagram.h 2010-05-16 06:24:29 +0000 |
87 | @@ -16,11 +16,8 @@ |
88 | #ifndef SCALESTACK_ECHO_FLOOD_DATAGRAM_H |
89 | #define SCALESTACK_ECHO_FLOOD_DATAGRAM_H |
90 | |
91 | -#include <sys/types.h> |
92 | -#include <sys/socket.h> |
93 | #include <ScaleStack/Common/Macros.h> |
94 | #include <ScaleStack/Network/Datagram.h> |
95 | -#include <ScaleStack/Echo/Flood/Flood.h> |
96 | |
97 | namespace ScaleStack { |
98 | namespace Kernel { |
99 | @@ -33,16 +30,18 @@ |
100 | namespace Flood { |
101 | |
102 | /** |
103 | - * Add common options for stream services. |
104 | + * Class for handling datagram requests. |
105 | */ |
106 | -SCALESTACK_API |
107 | -void DatagramOptions(Kernel::Module& module); |
108 | - |
109 | class SCALESTACK_API Datagram: public Network::Datagram |
110 | { |
111 | public: |
112 | |
113 | - Datagram(Network::DatagramService& service, struct addrinfo *send_addr); |
114 | + /** |
115 | + * Add common options for datagrams. |
116 | + */ |
117 | + static void Options(Kernel::Module& module); |
118 | + |
119 | + Datagram(Network::DatagramService& service); |
120 | |
121 | ~Datagram(); |
122 | |
123 | @@ -52,12 +51,15 @@ |
124 | void ready(void); |
125 | |
126 | /** |
127 | - * See Network::Datagram::read(). |
128 | + * See Network::Datagram::receive(). |
129 | */ |
130 | - size_t recv(uint8_t* buffer, size_t size, struct sockaddr *, socklen_t socklen); |
131 | + size_t receive(uint8_t* buffer, |
132 | + size_t size, |
133 | + struct sockaddr& peer, |
134 | + socklen_t peer_size); |
135 | |
136 | /** |
137 | - * See Network::Datagram::flushWrite(). |
138 | + * See Network::Datagram::flushSend(). |
139 | */ |
140 | void flushSend(void); |
141 | |
142 | @@ -78,9 +80,8 @@ |
143 | */ |
144 | Datagram& operator=(const Datagram&); |
145 | |
146 | - struct addrinfo* _send_addr; |
147 | - size_t _send_size; |
148 | size_t _iterations; |
149 | + size_t _packet_size; |
150 | size_t _read_offset; |
151 | size_t _write_offset; |
152 | }; |
153 | |
154 | === modified file 'ScaleStack/Echo/Flood/Flood.h' |
155 | --- ScaleStack/Echo/Flood/Flood.h 2010-05-02 23:02:34 +0000 |
156 | +++ ScaleStack/Echo/Flood/Flood.h 2010-05-16 06:24:29 +0000 |
157 | @@ -10,7 +10,7 @@ |
158 | |
159 | /** |
160 | * @file |
161 | - * @brief Echo Flood Declarations |
162 | + * @brief Echo Flood Module Declarations |
163 | */ |
164 | |
165 | #ifndef SCALESTACK_ECHO_FLOOD_FLOOD_H |
166 | @@ -20,16 +20,10 @@ |
167 | #include <sys/types.h> |
168 | |
169 | namespace ScaleStack { |
170 | -namespace Kernel { |
171 | - |
172 | -class Module; |
173 | - |
174 | -} /* namespace Kernel */ |
175 | - |
176 | namespace Echo { |
177 | namespace Flood { |
178 | |
179 | -const size_t random_buffer_size = 8385637; |
180 | +const size_t random_buffer_size = 385637; |
181 | extern uint8_t random_buffer[random_buffer_size]; |
182 | |
183 | } /* namespace Flood */ |
184 | |
185 | === modified file 'ScaleStack/Echo/Flood/Stream.cc' |
186 | --- ScaleStack/Echo/Flood/Stream.cc 2010-05-02 23:02:34 +0000 |
187 | +++ ScaleStack/Echo/Flood/Stream.cc 2010-05-16 06:24:29 +0000 |
188 | @@ -17,6 +17,7 @@ |
189 | |
190 | #include <cstring> |
191 | |
192 | +#include <ScaleStack/Echo/Flood/Flood.h> |
193 | #include <ScaleStack/Echo/Flood/Stream.h> |
194 | #include <ScaleStack/Kernel/Core.h> |
195 | #include <ScaleStack/Kernel/Module.h> |
196 | @@ -27,20 +28,15 @@ |
197 | namespace Flood { |
198 | |
199 | /* |
200 | - * Public functions. |
201 | + * Public methods. |
202 | */ |
203 | |
204 | -void StreamOptions(Kernel::Module& module) |
205 | +void Stream::Options(Kernel::Module& module) |
206 | { |
207 | module.addOption("iterations", "Number of iterations to run per stream, 0 means forever.", "COUNT", "1"); |
208 | - module.addOption("count", "Number of concurrent streams to open.", "COUNT", "1"); |
209 | module.addOption("reconnect", "Whether to reconnect between iterations.", "BOOLEAN", "False"); |
210 | } |
211 | |
212 | -/* |
213 | - * Public methods. |
214 | - */ |
215 | - |
216 | Stream::Stream(Network::StreamService& service): |
217 | Network::Stream(service), |
218 | _iterations(_module.getOption("iterations").getSizeValue()), |
219 | @@ -53,6 +49,11 @@ |
220 | { |
221 | } |
222 | |
223 | +void Stream::connected(void) |
224 | +{ |
225 | + flushWrite(); |
226 | +} |
227 | + |
228 | size_t Stream::read(uint8_t* buffer, size_t size) |
229 | { |
230 | if (memcmp(random_buffer + _read_offset, buffer, size)) |
231 | @@ -86,11 +87,6 @@ |
232 | true); |
233 | } |
234 | |
235 | -void Stream::connected(void) |
236 | -{ |
237 | - flushWrite(); |
238 | -} |
239 | - |
240 | void Stream::error(void) |
241 | { |
242 | _module.getCore().shutdown(); |
243 | |
244 | === modified file 'ScaleStack/Echo/Flood/Stream.h' |
245 | --- ScaleStack/Echo/Flood/Stream.h 2010-05-02 23:02:34 +0000 |
246 | +++ ScaleStack/Echo/Flood/Stream.h 2010-05-16 06:24:29 +0000 |
247 | @@ -18,7 +18,6 @@ |
248 | |
249 | #include <ScaleStack/Common/Macros.h> |
250 | #include <ScaleStack/Network/Stream.h> |
251 | -#include <ScaleStack/Echo/Flood/Flood.h> |
252 | |
253 | namespace ScaleStack { |
254 | namespace Kernel { |
255 | @@ -31,20 +30,27 @@ |
256 | namespace Flood { |
257 | |
258 | /** |
259 | - * Add common options for stream services. |
260 | + * Class for handling stream requests. |
261 | */ |
262 | -SCALESTACK_API |
263 | -void StreamOptions(Kernel::Module& module); |
264 | - |
265 | class SCALESTACK_API Stream: public Network::Stream |
266 | { |
267 | public: |
268 | |
269 | + /** |
270 | + * Add common options for streams. |
271 | + */ |
272 | + static void Options(Kernel::Module& module); |
273 | + |
274 | Stream(Network::StreamService& service); |
275 | |
276 | ~Stream(); |
277 | |
278 | /** |
279 | + * See Network::Stream::connected(). |
280 | + */ |
281 | + void connected(void); |
282 | + |
283 | + /** |
284 | * See Network::Stream::read(). |
285 | */ |
286 | size_t read(uint8_t* buffer, size_t size); |
287 | @@ -55,11 +61,6 @@ |
288 | void flushWrite(void); |
289 | |
290 | /** |
291 | - * See Network::Stream::connected(). |
292 | - */ |
293 | - void connected(void); |
294 | - |
295 | - /** |
296 | * See Network::Stream::error(). |
297 | */ |
298 | void error(void); |
299 | |
300 | === modified file 'ScaleStack/Echo/Flood/TCP/TCP.cc' |
301 | --- ScaleStack/Echo/Flood/TCP/TCP.cc 2010-05-01 05:23:39 +0000 |
302 | +++ ScaleStack/Echo/Flood/TCP/TCP.cc 2010-05-16 06:24:29 +0000 |
303 | @@ -28,7 +28,8 @@ |
304 | { |
305 | module.addOption("host", "Host to connect to.", "HOST", "localhost"); |
306 | module.addOption("port", "Port to connect to.", "PORT", "7"); |
307 | - Echo::Flood::StreamOptions(module); |
308 | + module.addOption("count", "Number of concurrent connections to open.", "COUNT", "1"); |
309 | + Echo::Flood::Stream::Options(module); |
310 | } |
311 | |
312 | static void start(Kernel::Module& module) |
313 | |
314 | === modified file 'ScaleStack/Echo/Flood/UDP/Service.cc' |
315 | --- ScaleStack/Echo/Flood/UDP/Service.cc 2010-05-02 23:02:34 +0000 |
316 | +++ ScaleStack/Echo/Flood/UDP/Service.cc 2010-05-16 06:24:29 +0000 |
317 | @@ -15,8 +15,6 @@ |
318 | |
319 | #include "config.h" |
320 | |
321 | -#include <ScaleStack/Kernel/Module.h> |
322 | -#include <ScaleStack/Kernel/Option.h> |
323 | #include <ScaleStack/Echo/Flood/Datagram.h> |
324 | #include <ScaleStack/Echo/Flood/UDP/Service.h> |
325 | |
326 | @@ -30,21 +28,18 @@ |
327 | */ |
328 | |
329 | Service::Service(Kernel::Module& module): |
330 | - Network::IP::UDP::SocketService(module), |
331 | - _send_addr(getaddrinfo(module.getOption("host").getValue(), |
332 | - module.getOption("port").getValue())) |
333 | + Network::IP::UDP::SocketService(module) |
334 | { |
335 | } |
336 | |
337 | Service::~Service() |
338 | { |
339 | - freeaddrinfo(_send_addr); |
340 | shutdown(); |
341 | } |
342 | |
343 | Network::Datagram* Service::addDatagram(void) |
344 | { |
345 | - return new Datagram(*this, _send_addr); |
346 | + return new Datagram(*this); |
347 | } |
348 | |
349 | void Service::removeDatagram(Network::Datagram* datagram) |
350 | |
351 | === modified file 'ScaleStack/Echo/Flood/UDP/Service.h' |
352 | --- ScaleStack/Echo/Flood/UDP/Service.h 2010-05-02 23:02:34 +0000 |
353 | +++ ScaleStack/Echo/Flood/UDP/Service.h 2010-05-16 06:24:29 +0000 |
354 | @@ -39,7 +39,7 @@ |
355 | /** |
356 | * See Network::DatagramService::removeDatagram(). |
357 | */ |
358 | - void removeDatagram(Network::Datagram* stream); |
359 | + void removeDatagram(Network::Datagram* datagram); |
360 | |
361 | private: |
362 | |
363 | @@ -52,8 +52,6 @@ |
364 | * Don't allow assignment of objects. |
365 | */ |
366 | Service& operator=(const Service&); |
367 | - |
368 | - struct addrinfo* _send_addr; |
369 | }; |
370 | |
371 | } /* namespace UDP */ |
372 | |
373 | === modified file 'ScaleStack/Echo/Flood/UDP/UDP.cc' |
374 | --- ScaleStack/Echo/Flood/UDP/UDP.cc 2010-05-04 01:00:14 +0000 |
375 | +++ ScaleStack/Echo/Flood/UDP/UDP.cc 2010-05-16 06:24:29 +0000 |
376 | @@ -26,9 +26,9 @@ |
377 | |
378 | static void options(Kernel::Module& module) |
379 | { |
380 | - module.addOption("host", "Host to send to.", "HOST", "localhost"); |
381 | - module.addOption("port", "Port to send to.", "PORT", "7"); |
382 | - Echo::Flood::DatagramOptions(module); |
383 | + Network::IP::UDP::SocketService::Options(module, ":7"); |
384 | + module.addOption("count", "Number of concurrent sockets to open.", "COUNT", "1"); |
385 | + Echo::Flood::Datagram::Options(module); |
386 | } |
387 | |
388 | static void start(Kernel::Module& module) |
389 | @@ -53,17 +53,13 @@ |
390 | static void run(Kernel::Module& module) |
391 | { |
392 | Echo::Flood::UDP::Service& service = static_cast<Echo::Flood::UDP::Service&>(module.getCore().getService("Echo::Flood::UDP")); |
393 | - struct addrinfo *addrinfo = service.getaddrinfo("0.0.0.0", "0"); /* random port */ |
394 | |
395 | for (int count = module.getOption("count").getIntValue(); |
396 | count != 0; |
397 | --count) |
398 | { |
399 | - /* bind to random local port */ |
400 | - service.addSocket(addrinfo); |
401 | + service.addSocketWithPeer(); |
402 | } |
403 | - |
404 | - service.freeaddrinfo(addrinfo); |
405 | } |
406 | |
407 | SCALESTACK_KERNEL_MODULE(options, start, stop, run, NULL); |
408 | |
409 | === modified file 'ScaleStack/Echo/Flood/UnixStream/UnixStream.cc' |
410 | --- ScaleStack/Echo/Flood/UnixStream/UnixStream.cc 2010-05-01 05:23:39 +0000 |
411 | +++ ScaleStack/Echo/Flood/UnixStream/UnixStream.cc 2010-05-16 06:24:29 +0000 |
412 | @@ -27,7 +27,8 @@ |
413 | static void options(Kernel::Module& module) |
414 | { |
415 | module.addOption("unix_socket", "Unix socket to connect to.", "SOCKET", "/tmp/echoserver.socket"); |
416 | - Echo::Flood::StreamOptions(module); |
417 | + module.addOption("count", "Number of concurrent connections to open.", "COUNT", "1"); |
418 | + Echo::Flood::Stream::Options(module); |
419 | } |
420 | |
421 | static void start(Kernel::Module& module) |
422 | |
423 | === modified file 'ScaleStack/Echo/Flood/plugin.ini' |
424 | --- ScaleStack/Echo/Flood/plugin.ini 2010-05-02 23:02:34 +0000 |
425 | +++ ScaleStack/Echo/Flood/plugin.ini 2010-05-16 06:24:29 +0000 |
426 | @@ -4,6 +4,6 @@ |
427 | version=0.1 |
428 | author=Eric Day <eday@oddments.org> |
429 | license=BSD |
430 | -sources=Flood.cc Stream.cc Datagram.cc |
431 | -headers=Stream.h Datagram.h |
432 | +sources=Datagram.cc Flood.cc Stream.cc |
433 | +headers=Datagram.h Flood.h Stream.h |
434 | dependencies=Network |
435 | |
436 | === modified file 'ScaleStack/Echo/Server/Datagram.cc' |
437 | --- ScaleStack/Echo/Server/Datagram.cc 2010-05-03 04:56:24 +0000 |
438 | +++ ScaleStack/Echo/Server/Datagram.cc 2010-05-16 06:24:29 +0000 |
439 | @@ -15,8 +15,6 @@ |
440 | |
441 | #include "config.h" |
442 | |
443 | -#include <string.h> |
444 | -#include <ScaleStack/Kernel/Module.h> |
445 | #include <ScaleStack/Echo/Server/Datagram.h> |
446 | |
447 | namespace ScaleStack { |
448 | @@ -30,9 +28,7 @@ |
449 | Datagram::Datagram(Network::DatagramService& service): |
450 | Network::Datagram(service), |
451 | _size(), |
452 | - _buffer(), |
453 | - _sockaddr(), |
454 | - _socklen(0) |
455 | + _buffer() |
456 | { |
457 | } |
458 | |
459 | @@ -40,13 +36,10 @@ |
460 | { |
461 | } |
462 | |
463 | -size_t Datagram::recv(uint8_t* buffer, size_t size, struct sockaddr *sockaddr, socklen_t socklen) |
464 | +size_t Datagram::receive(uint8_t* buffer, size_t size, struct sockaddr&, socklen_t) |
465 | { |
466 | _size = size; |
467 | _buffer = buffer; |
468 | - _sockaddr = sockaddr; |
469 | - _socklen = socklen; |
470 | - |
471 | return _echo(); |
472 | } |
473 | |
474 | @@ -61,7 +54,7 @@ |
475 | |
476 | size_t Datagram::_echo(void) |
477 | { |
478 | - return send(_buffer, _size, _sockaddr, _socklen); |
479 | + return send(_buffer, _size); |
480 | } |
481 | |
482 | } /* namespace Server */ |
483 | |
484 | === modified file 'ScaleStack/Echo/Server/Datagram.h' |
485 | --- ScaleStack/Echo/Server/Datagram.h 2010-05-03 04:56:24 +0000 |
486 | +++ ScaleStack/Echo/Server/Datagram.h 2010-05-16 06:24:29 +0000 |
487 | @@ -32,9 +32,12 @@ |
488 | ~Datagram(); |
489 | |
490 | /** |
491 | - * See Network::Datagram::recv(). |
492 | + * See Network::Datagram::receive(). |
493 | */ |
494 | - size_t recv(uint8_t* buffer, size_t size, struct sockaddr *sockaddr, socklen_t socklen); |
495 | + size_t receive(uint8_t* buffer, |
496 | + size_t size, |
497 | + struct sockaddr& peer, |
498 | + socklen_t peer_size); |
499 | |
500 | /** |
501 | * See Network::Datagram::flushSend(). |
502 | @@ -54,15 +57,14 @@ |
503 | Datagram& operator=(const Datagram&); |
504 | |
505 | /** |
506 | - * Echo the data back to the stream by writing any data that was |
507 | - * read. This is used by both the read() and flushWrite() methods. |
508 | + * Echo the data received back to the sender. This is used by both the |
509 | + * receive() and flushSend() methods. |
510 | */ |
511 | + SCALESTACK_LOCAL |
512 | size_t _echo(void); |
513 | |
514 | size_t _size; |
515 | uint8_t* _buffer; |
516 | - struct sockaddr* _sockaddr; |
517 | - socklen_t _socklen; |
518 | }; |
519 | |
520 | } /* namespace Server */ |
521 | |
522 | === modified file 'ScaleStack/Echo/Server/Stream.h' |
523 | --- ScaleStack/Echo/Server/Stream.h 2010-05-01 05:23:39 +0000 |
524 | +++ ScaleStack/Echo/Server/Stream.h 2010-05-16 06:24:29 +0000 |
525 | @@ -54,9 +54,10 @@ |
526 | Stream& operator=(const Stream&); |
527 | |
528 | /** |
529 | - * Echo the data back to the stream by writing any data that was |
530 | - * read. This is used by both the read() and flushWrite() methods. |
531 | + * Echo the data read back to the client. This is used by both the read() |
532 | + * and flushWrite() methods. |
533 | */ |
534 | + SCALESTACK_LOCAL |
535 | size_t _echo(void); |
536 | |
537 | size_t _size; |
538 | |
539 | === modified file 'ScaleStack/Echo/Server/TCP/TCP.cc' |
540 | --- ScaleStack/Echo/Server/TCP/TCP.cc 2010-04-29 07:39:49 +0000 |
541 | +++ ScaleStack/Echo/Server/TCP/TCP.cc 2010-05-16 06:24:29 +0000 |
542 | @@ -33,6 +33,16 @@ |
543 | try |
544 | { |
545 | module.getCore().addService("Echo::Server::TCP", service); |
546 | + |
547 | + try |
548 | + { |
549 | + //service->addListeners(); |
550 | + } |
551 | + catch (exception&) |
552 | + { |
553 | + module.getCore().removeService("Echo::Server::TCP"); |
554 | + throw; |
555 | + } |
556 | } |
557 | catch (exception&) |
558 | { |
559 | |
560 | === modified file 'ScaleStack/Echo/Server/UDP/Service.h' |
561 | --- ScaleStack/Echo/Server/UDP/Service.h 2010-05-02 23:02:34 +0000 |
562 | +++ ScaleStack/Echo/Server/UDP/Service.h 2010-05-16 06:24:29 +0000 |
563 | @@ -39,7 +39,7 @@ |
564 | /** |
565 | * See Network::DatagramService::removeDatagram(). |
566 | */ |
567 | - void removeDatagram(Network::Datagram* stream); |
568 | + void removeDatagram(Network::Datagram* datagram); |
569 | |
570 | private: |
571 | |
572 | |
573 | === modified file 'ScaleStack/Echo/Server/UDP/Test/Run.cc' |
574 | --- ScaleStack/Echo/Server/UDP/Test/Run.cc 2010-05-04 01:00:14 +0000 |
575 | +++ ScaleStack/Echo/Server/UDP/Test/Run.cc 2010-05-16 06:24:29 +0000 |
576 | @@ -15,17 +15,32 @@ |
577 | |
578 | #include <ScaleStack/Common/Test.h> |
579 | |
580 | +static const char* test_hosts = "127.0.0.1:32123"; |
581 | + |
582 | TEST_SUITE_BEGIN |
583 | |
584 | -TEST_BEGIN(TestEchoServer) |
585 | - const char* test_port = "32123"; |
586 | - const char* test_host = "127.0.0.1"; |
587 | - const char* test_hostport = "127.0.0.1:32123"; |
588 | - |
589 | - core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE); |
590 | - core.addModuleOptionValue("Echo::Server::UDP", "udp_hosts", test_hostport); |
591 | - core.addModuleOptionValue("Echo::Flood::UDP", "port", test_port); |
592 | - core.addModuleOptionValue("Echo::Flood::UDP", "host", test_host); |
593 | +TEST_BEGIN(default) |
594 | + core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE); |
595 | + core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts); |
596 | + core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts); |
597 | + core.setSignalHandlers(); |
598 | + core.run(); |
599 | +TEST_END |
600 | + |
601 | +TEST_BEGIN(iterations) |
602 | + core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE); |
603 | + core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts); |
604 | + core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts); |
605 | + core.addModuleOptionValue("Echo::Flood::UDP", "iterations", "5"); |
606 | + core.setSignalHandlers(); |
607 | + core.run(); |
608 | +TEST_END |
609 | + |
610 | +TEST_BEGIN(packet_size) |
611 | + core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE); |
612 | + core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts); |
613 | + core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts); |
614 | + core.addModuleOptionValue("Echo::Flood::UDP", "packet_size", "16384"); |
615 | core.setSignalHandlers(); |
616 | core.run(); |
617 | TEST_END |
618 | |
619 | === modified file 'ScaleStack/Echo/Server/UDP/UDP.cc' |
620 | --- ScaleStack/Echo/Server/UDP/UDP.cc 2010-05-04 08:58:05 +0000 |
621 | +++ ScaleStack/Echo/Server/UDP/UDP.cc 2010-05-16 06:24:29 +0000 |
622 | @@ -25,7 +25,7 @@ |
623 | |
624 | static void options(Kernel::Module& module) |
625 | { |
626 | - Network::IP::UDP::SocketOptions(module, "7"); |
627 | + Network::IP::UDP::SocketService::Options(module, ":7"); |
628 | } |
629 | |
630 | static void start(Kernel::Module& module) |
631 | @@ -37,7 +37,7 @@ |
632 | |
633 | try |
634 | { |
635 | - service->processSocketOptions(); |
636 | + service->addSockets(); |
637 | } |
638 | catch (exception&) |
639 | { |
640 | |
641 | === modified file 'ScaleStack/Echo/Server/plugin.ini' |
642 | --- ScaleStack/Echo/Server/plugin.ini 2010-05-02 23:02:34 +0000 |
643 | +++ ScaleStack/Echo/Server/plugin.ini 2010-05-16 06:24:29 +0000 |
644 | @@ -4,6 +4,6 @@ |
645 | version=0.1 |
646 | author=Eric Day <eday@oddments.org> |
647 | license=BSD |
648 | -sources=Server.cc Stream.cc Datagram.cc |
649 | -headers=Stream.h Datagram.h |
650 | +sources=Datagram.cc Server.cc Stream.cc |
651 | +headers=Datagram.h Stream.h |
652 | dependencies=Network |
653 | |
654 | === modified file 'ScaleStack/Network/Datagram.cc' |
655 | --- ScaleStack/Network/Datagram.cc 2010-05-04 08:58:05 +0000 |
656 | +++ ScaleStack/Network/Datagram.cc 2010-05-16 06:24:29 +0000 |
657 | @@ -36,11 +36,11 @@ |
658 | DatagramProvider::DatagramProvider(Event::Service& service): |
659 | Event::Handler(service), |
660 | _file_descriptor(-1), |
661 | - _peer_address_size(), |
662 | - _recv_buffer_size(), |
663 | + _peer_size(), |
664 | + _receive_buffer_size(), |
665 | _datagram(NULL), |
666 | - _peer_address(reinterpret_cast<struct sockaddr*>(&_peer_address_storage)), |
667 | - _peer_address_storage() |
668 | + _peer(reinterpret_cast<struct sockaddr*>(&_peer_storage)), |
669 | + _peer_storage() |
670 | { |
671 | } |
672 | |
673 | @@ -63,51 +63,60 @@ |
674 | watchRead(); |
675 | } |
676 | |
677 | -void DatagramProvider::consume(size_t size) |
678 | -{ |
679 | - _consume(size); |
680 | -} |
681 | - |
682 | -void DatagramProvider::bind(const struct addrinfo& address) |
683 | -{ |
684 | - int file_descriptor = socket(address.ai_family, |
685 | - address.ai_socktype, |
686 | - address.ai_protocol); |
687 | +void DatagramProvider::create(int family) |
688 | +{ |
689 | + int file_descriptor = socket(family, SOCK_DGRAM, 0); |
690 | if (file_descriptor == -1) |
691 | _module.logFatal("Error creating datagram socket: %d", errno); |
692 | |
693 | - int return_code = ::bind(file_descriptor, |
694 | - address.ai_addr, |
695 | - address.ai_addrlen); |
696 | + setFileDescriptor(file_descriptor); |
697 | +} |
698 | + |
699 | +void DatagramProvider::bind(const struct sockaddr& address, |
700 | + socklen_t address_size) |
701 | +{ |
702 | + create(address.sa_family); |
703 | + |
704 | + int return_code = ::bind(_file_descriptor, &address, address_size); |
705 | if (return_code == -1) |
706 | { |
707 | - close(file_descriptor); |
708 | - |
709 | if (errno == EADDRINUSE) |
710 | _module.logFatal("Bind failed, address already in use"); |
711 | |
712 | _module.logFatal("Error binding datagram socket, bind: %d", errno); |
713 | } |
714 | - |
715 | - setFileDescriptor(file_descriptor); |
716 | +} |
717 | + |
718 | +void DatagramProvider::setPeer(const struct sockaddr& peer, socklen_t peer_size) |
719 | +{ |
720 | + memcpy(_peer, &peer, peer_size); |
721 | + _peer_size = peer_size; |
722 | +} |
723 | + |
724 | +void DatagramProvider::consume(size_t size) |
725 | +{ |
726 | + _consume(size); |
727 | } |
728 | |
729 | size_t DatagramProvider::send(uint8_t* buffer, |
730 | size_t size, |
731 | - const sockaddr* peer_address, |
732 | - socklen_t peer_address_size) |
733 | + const struct sockaddr& peer, |
734 | + socklen_t peer_size) |
735 | { |
736 | if (size == 0) |
737 | return 0; |
738 | |
739 | - ssize_t written = ::sendto(_file_descriptor, buffer, size, 0, |
740 | - peer_address, peer_address_size); |
741 | - |
742 | + ssize_t written = ::sendto(_file_descriptor, |
743 | + buffer, |
744 | + size, |
745 | + 0, |
746 | + &peer, |
747 | + peer_size); |
748 | if (written > 0) |
749 | { |
750 | if (written != static_cast<ssize_t>(size)) |
751 | { |
752 | - _module.logFatal("Datagram sendto() returned %d, but tried to send %d", |
753 | + _module.logError("Datagram sendto() returned %d, but tried to send %d", |
754 | written, size); |
755 | error(); |
756 | return 0; |
757 | @@ -121,9 +130,7 @@ |
758 | } |
759 | |
760 | if (written == 0) |
761 | - { |
762 | return 0; |
763 | - } |
764 | |
765 | if (errno == EAGAIN) |
766 | { |
767 | @@ -134,7 +141,15 @@ |
768 | _module.logError("Datagram sendto() returned %d", errno); |
769 | error(); |
770 | return 0; |
771 | -} |
772 | +} |
773 | + |
774 | +size_t DatagramProvider::send(uint8_t* buffer, size_t size) |
775 | +{ |
776 | + if (_peer_size == 0) |
777 | + _module.logFatal("No peer address was set."); |
778 | + |
779 | + return send(buffer, size, *_peer, _peer_size); |
780 | +} |
781 | |
782 | void DatagramProvider::run(void) |
783 | { |
784 | @@ -143,36 +158,36 @@ |
785 | |
786 | void DatagramProvider::readReady(int) |
787 | { |
788 | - if (_recv_buffer_size > 0) |
789 | + if (_receive_buffer_size > 0) |
790 | { |
791 | - /* Can only buffer a single packet, and we alrecvy have one */ |
792 | + /* Can only buffer a single packet, and we already have one */ |
793 | return; |
794 | } |
795 | |
796 | - _peer_address_size = sizeof(_peer_address_storage); |
797 | + _peer_size = sizeof(_peer_storage); |
798 | |
799 | ssize_t return_size = ::recvfrom(_file_descriptor, |
800 | - _recv_buffer, _recv_buffer_max_size, 0, |
801 | - _peer_address, &_peer_address_size); |
802 | + _receive_buffer, _receive_buffer_max_size, 0, |
803 | + _peer, &_peer_size); |
804 | |
805 | if (return_size > 0) |
806 | { |
807 | _module.logDebug("Recved %d bytes", return_size); |
808 | |
809 | - _recv_buffer_size = static_cast<size_t>(return_size); |
810 | - |
811 | - _consume(recv(_recv_buffer, _recv_buffer_size, _peer_address, _peer_address_size)); |
812 | - |
813 | - if (_recv_buffer_size == 0) |
814 | + _receive_buffer_size = static_cast<size_t>(return_size); |
815 | + |
816 | + _consume(receive(_receive_buffer, _receive_buffer_size, *_peer, _peer_size)); |
817 | + |
818 | + if (_receive_buffer_size == 0) |
819 | { |
820 | return; |
821 | } |
822 | |
823 | - if (_recv_buffer_size != static_cast<size_t>(return_size)) |
824 | + if (_receive_buffer_size != static_cast<size_t>(return_size)) |
825 | { |
826 | - /* caller must consume all or none of the recv buffer */ |
827 | + /* caller must consume all or none of the receive buffer */ |
828 | |
829 | - _module.logFatal("Caller consumed partial datagram recv buffer"); |
830 | + _module.logFatal("Caller consumed partial datagram receive buffer"); |
831 | return; |
832 | } |
833 | |
834 | @@ -212,16 +227,19 @@ |
835 | if (size == 0) |
836 | return; |
837 | |
838 | - if (size != _recv_buffer_size) |
839 | + if (size > _receive_buffer_size) |
840 | { |
841 | - _module.logFatal("Tried to consume incorrect size on recv buffer for datagram socket"); |
842 | + _module.logError("Consumed more data than is in buffer: %u > %u", |
843 | + size, _receive_buffer_size); |
844 | error(); |
845 | - return; |
846 | - } |
847 | - |
848 | - _recv_buffer_size = 0; |
849 | - |
850 | - watchRead(); |
851 | + } |
852 | + else if (size == _receive_buffer_size) |
853 | + { |
854 | + _receive_buffer_size = 0; |
855 | + watchRead(); |
856 | + } |
857 | + else |
858 | + _receive_buffer_size -= size; |
859 | } |
860 | |
861 | } /* namespace Network */ |
862 | |
863 | === modified file 'ScaleStack/Network/Datagram.h' |
864 | --- ScaleStack/Network/Datagram.h 2010-05-04 08:58:05 +0000 |
865 | +++ ScaleStack/Network/Datagram.h 2010-05-16 06:24:29 +0000 |
866 | @@ -24,8 +24,6 @@ |
867 | #include <ScaleStack/Event/Handler.h> |
868 | #include <ScaleStack/Network/DatagramService.h> |
869 | |
870 | -struct addrinfo; |
871 | - |
872 | namespace ScaleStack { |
873 | namespace Kernel { |
874 | |
875 | @@ -62,20 +60,20 @@ |
876 | * |
877 | * @param[in] buffer Data that was read. |
878 | * @param[in] size Size of data available in buffer. |
879 | - * @param[in] peer_address Socket address received from. |
880 | - * @param[in] peer_address_size Socket address length. |
881 | + * @param[in] peer Socket address the packet was received from. |
882 | + * @param[in] peer_size Socket address length. |
883 | * @return Amount of data that was consumed. |
884 | */ |
885 | - virtual size_t recv(uint8_t* buffer, |
886 | - size_t size, |
887 | - struct sockaddr* peer_address, |
888 | - socklen_t peer_address_size) = 0; |
889 | + virtual size_t receive(uint8_t* buffer, |
890 | + size_t size, |
891 | + struct sockaddr& peer, |
892 | + socklen_t peer_size) = 0; |
893 | |
894 | /** |
895 | - * Notify the connection that the recv buffer has been consumed. |
896 | - * This is required after a recv() call was not able to consume |
897 | + * Notify the connection that the receive buffer has been consumed. |
898 | + * This is required after a receive() call was not able to consume |
899 | * all the data. This can be called at a later time to remove the data |
900 | - * from the read buffer, such as in flushSend(). After the recv buffer |
901 | + * from the read buffer, such as in flushSend(). After the receive buffer |
902 | * has been flushed, the connection will start watching for new data. |
903 | * |
904 | * @param[in] size The amount of data to consume. |
905 | @@ -88,14 +86,24 @@ |
906 | * |
907 | * @param[in] buffer Buffer to write. |
908 | * @param[in] size Size of buffer. |
909 | - * @param[in] peer_address Socket address to send to. |
910 | - * @param[in] peer_address_size Socket address length. |
911 | + * @param[in] peer Socket address to send to. |
912 | + * @param[in] peer_size Socket address length. |
913 | * @return Amount of data sent. |
914 | */ |
915 | size_t send(uint8_t* buffer, |
916 | size_t size, |
917 | - const struct sockaddr* peer_address, |
918 | - socklen_t peer_address_size); |
919 | + const struct sockaddr& peer, |
920 | + socklen_t peer_size); |
921 | + |
922 | + /** |
923 | + * Same as send(), but use the default peer address this datagram was |
924 | + * created with. |
925 | + * |
926 | + * @param[in] buffer Buffer to write. |
927 | + * @param[in] size Size of buffer. |
928 | + * @return Amount of data sent. |
929 | + */ |
930 | + size_t send(uint8_t* buffer, size_t size); |
931 | |
932 | /** |
933 | * This is called to notify derived classes that they should trying sending |
934 | @@ -192,37 +200,56 @@ |
935 | virtual void setFileDescriptor(int file_descriptor); |
936 | |
937 | /** |
938 | + * Create the socket using a random local address. |
939 | + */ |
940 | + void create(int family); |
941 | + |
942 | + /** |
943 | + * Create the socket and bind to a specific local address. |
944 | + * |
945 | + * @param[in] address Address to bind to. |
946 | + * @param[in] address_size Size of the address structure. |
947 | + */ |
948 | + void bind(const struct sockaddr& address, socklen_t address_size); |
949 | + |
950 | + /** |
951 | + * Set the initial peer address for sending packets. |
952 | + * |
953 | + * @param[in] peer Peer address to set. |
954 | + * @param[in] peer_size Size of peer address structure. |
955 | + */ |
956 | + void setPeer(const struct sockaddr& peer, socklen_t peer_size); |
957 | + |
958 | + /** |
959 | * See Datagram::ready(). |
960 | */ |
961 | void ready(void); |
962 | |
963 | /** |
964 | - * See Datagram::recv(). |
965 | - */ |
966 | - size_t recv(uint8_t* buffer, |
967 | - size_t size, |
968 | - struct sockaddr *peer_address, |
969 | - socklen_t peer_address_size); |
970 | - |
971 | - /** |
972 | - * Create and bind a datagram socket. |
973 | - * |
974 | - * @param[in] address Address to bind. |
975 | - */ |
976 | - void bind(const struct addrinfo& addrinfo); |
977 | + * See Datagram::receive(). |
978 | + */ |
979 | + size_t receive(uint8_t* buffer, |
980 | + size_t size, |
981 | + struct sockaddr& peer, |
982 | + socklen_t peer_size); |
983 | |
984 | /** |
985 | * See Datagram::consume(). |
986 | */ |
987 | - virtual void consume(size_t size); |
988 | - |
989 | - /** |
990 | - * See Datagram::send(). |
991 | - */ |
992 | - virtual size_t send(uint8_t* buffer, |
993 | - size_t size, |
994 | - const struct sockaddr* peer_address, |
995 | - socklen_t peer_address_size); |
996 | + void consume(size_t size); |
997 | + |
998 | + /** |
999 | + * See Datagram::send(). |
1000 | + */ |
1001 | + size_t send(uint8_t* buffer, |
1002 | + size_t size, |
1003 | + const struct sockaddr& peer, |
1004 | + socklen_t peer_size); |
1005 | + |
1006 | + /** |
1007 | + * See Datagram::send(). |
1008 | + */ |
1009 | + size_t send(uint8_t* buffer, size_t size); |
1010 | |
1011 | /** |
1012 | * See Datagram::flushSend(). |
1013 | @@ -263,8 +290,8 @@ |
1014 | DatagramProvider& operator=(const DatagramProvider&); |
1015 | |
1016 | /** |
1017 | - * This will recv data from the connection into the buffer and call |
1018 | - * recv(). This implements a method in the base class so does not have |
1019 | + * This will receive data from the connection into the buffer and call |
1020 | + * receive(). This implements a method in the base class so does not have |
1021 | * the _ prefix. |
1022 | * |
1023 | * @param[in] file_descriptor File descriptor to read data on. |
1024 | @@ -280,23 +307,23 @@ |
1025 | void writeReady(int file_descriptor); |
1026 | |
1027 | /** |
1028 | - * Perform the recv buffer consumption, used by both readReady() and |
1029 | - * consume(). |
1030 | + * Perform the receive buffer consumption, used by both readReady() |
1031 | + * and consume(). |
1032 | * |
1033 | * @param[in] size Amount of buffer to consume. |
1034 | */ |
1035 | SCALESTACK_LOCAL |
1036 | void _consume(size_t size); |
1037 | |
1038 | - static const size_t _recv_buffer_max_size = 64 * 1024; /* max Datagram size */ |
1039 | + static const size_t _receive_buffer_max_size = 64 * 1024; /* max datagram size */ |
1040 | |
1041 | int _file_descriptor; |
1042 | - socklen_t _peer_address_size; |
1043 | - size_t _recv_buffer_size; |
1044 | + socklen_t _peer_size; |
1045 | + size_t _receive_buffer_size; |
1046 | Datagram* _datagram; |
1047 | - struct sockaddr* _peer_address; |
1048 | - struct sockaddr_storage _peer_address_storage; |
1049 | - uint8_t _recv_buffer[_recv_buffer_max_size]; |
1050 | + struct sockaddr* _peer; |
1051 | + struct sockaddr_storage _peer_storage; |
1052 | + uint8_t _receive_buffer[_receive_buffer_max_size]; |
1053 | }; |
1054 | |
1055 | /* |
1056 | @@ -325,10 +352,15 @@ |
1057 | |
1058 | inline size_t Datagram::send(uint8_t* buffer, |
1059 | size_t size, |
1060 | - const struct sockaddr* peer_address, |
1061 | - socklen_t peer_address_size) |
1062 | -{ |
1063 | - return _datagram_provider->send(buffer, size, peer_address, peer_address_size); |
1064 | + const struct sockaddr& peer, |
1065 | + socklen_t peer_size) |
1066 | +{ |
1067 | + return _datagram_provider->send(buffer, size, peer, peer_size); |
1068 | +} |
1069 | + |
1070 | +inline size_t Datagram::send(uint8_t* buffer, size_t size) |
1071 | +{ |
1072 | + return _datagram_provider->send(buffer, size); |
1073 | } |
1074 | |
1075 | inline void Datagram::remove(void) |
1076 | @@ -379,12 +411,12 @@ |
1077 | _datagram->ready(); |
1078 | } |
1079 | |
1080 | -inline size_t DatagramProvider::recv(uint8_t* buffer, |
1081 | - size_t size, |
1082 | - struct sockaddr* peer_address, |
1083 | - socklen_t peer_address_size) |
1084 | +inline size_t DatagramProvider::receive(uint8_t* buffer, |
1085 | + size_t size, |
1086 | + struct sockaddr& peer, |
1087 | + socklen_t peer_size) |
1088 | { |
1089 | - return _datagram->recv(buffer, size, peer_address, peer_address_size); |
1090 | + return _datagram->receive(buffer, size, peer, peer_size); |
1091 | } |
1092 | |
1093 | inline void DatagramProvider::flushSend(void) |
1094 | |
1095 | === modified file 'ScaleStack/Network/IP/Common.cc' |
1096 | --- ScaleStack/Network/IP/Common.cc 2010-05-04 08:58:05 +0000 |
1097 | +++ ScaleStack/Network/IP/Common.cc 2010-05-16 06:24:29 +0000 |
1098 | @@ -15,13 +15,10 @@ |
1099 | |
1100 | #include "config.h" |
1101 | |
1102 | -#include <vector> |
1103 | -#include <cerrno> |
1104 | -#include <cstring> |
1105 | -#include <sys/types.h> /* Must be before socket headers for FreeBSD. */ |
1106 | +#include <exception> |
1107 | +#include <netdb.h> |
1108 | #include <sys/socket.h> |
1109 | -#include <netdb.h> |
1110 | -#include <unistd.h> |
1111 | +#include <sys/types.h> |
1112 | |
1113 | #include <ScaleStack/Kernel/Module.h> |
1114 | #include <ScaleStack/Network/IP/Common.h> |
1115 | @@ -44,49 +41,39 @@ |
1116 | { |
1117 | } |
1118 | |
1119 | -void Common::processHostsandPorts(vector<pair<string,string>> hosts, |
1120 | - vector<string> ports, |
1121 | - const struct addrinfo* addrinfo_options) |
1122 | +void Common::parseHosts(Kernel::Module& module, |
1123 | + const std::vector<std::pair<std::string,std::string> >& hosts, |
1124 | + const struct addrinfo& address_options, |
1125 | + bool local_only) |
1126 | { |
1127 | - for (vector<pair<string,string> >::iterator host = hosts.begin(); |
1128 | + for (vector<pair<string,string> >::const_iterator host = hosts.begin(); |
1129 | host != hosts.end(); |
1130 | ++host) |
1131 | { |
1132 | - if (host->second == "") |
1133 | - { |
1134 | - for (vector<string>::iterator port = ports.begin(); |
1135 | - port != ports.end(); |
1136 | - ++port) |
1137 | - { |
1138 | - _processAddrinfo(host->first, *port, addrinfo_options); |
1139 | - } |
1140 | - } |
1141 | - else |
1142 | - _processAddrinfo(host->first, host->second, addrinfo_options); |
1143 | - } |
1144 | -} |
1145 | - |
1146 | -/* |
1147 | - * Private methods. |
1148 | - */ |
1149 | - |
1150 | -void Common::_processAddrinfo(string host, string port, |
1151 | - const struct addrinfo* addrinfo_options) |
1152 | -{ |
1153 | - struct addrinfo* addrinfo; |
1154 | - |
1155 | - int return_code = ::getaddrinfo(host == "" ? NULL : host.c_str(), |
1156 | - port.c_str(), |
1157 | - addrinfo_options, |
1158 | - &addrinfo); |
1159 | - if (return_code != 0) |
1160 | - { |
1161 | - ScaleStack::Common::Exception("Error doing getaddrinfo: %s", gai_strerror(return_code)); |
1162 | - } |
1163 | - |
1164 | - processAddrinfo(addrinfo); |
1165 | - |
1166 | - freeaddrinfo(addrinfo); |
1167 | + struct addrinfo* address_list; |
1168 | + |
1169 | + int return_code = ::getaddrinfo(host->first == "" ? NULL : host->first.c_str(), |
1170 | + host->second == "" ? NULL : host->second.c_str(), |
1171 | + &address_options, |
1172 | + &address_list); |
1173 | + if (return_code != 0) |
1174 | + module.logFatal("Failed getaddrinfo: %s", gai_strerror(return_code)); |
1175 | + |
1176 | + try |
1177 | + { |
1178 | + if (local_only) |
1179 | + addAddressList(address_list, NULL); |
1180 | + else |
1181 | + addAddressList(NULL, address_list); |
1182 | + } |
1183 | + catch (exception&) |
1184 | + { |
1185 | + freeaddrinfo(address_list); |
1186 | + throw; |
1187 | + } |
1188 | + |
1189 | + freeaddrinfo(address_list); |
1190 | + } |
1191 | } |
1192 | |
1193 | } /* namespace IP */ |
1194 | |
1195 | === modified file 'ScaleStack/Network/IP/Common.h' |
1196 | --- ScaleStack/Network/IP/Common.h 2010-05-04 08:58:05 +0000 |
1197 | +++ ScaleStack/Network/IP/Common.h 2010-05-16 06:24:29 +0000 |
1198 | @@ -16,24 +16,23 @@ |
1199 | #ifndef SCALESTACK_NETWORK_IP_COMMON_H |
1200 | #define SCALESTACK_NETWORK_IP_COMMON_H |
1201 | |
1202 | +#include <string> |
1203 | #include <vector> |
1204 | -#include <stdint.h> |
1205 | -#include <string> |
1206 | -#include <sys/types.h> |
1207 | -#include <sys/socket.h> |
1208 | -#include <netdb.h> |
1209 | |
1210 | #include <ScaleStack/Common/Macros.h> |
1211 | #include <ScaleStack/Event/Handler.h> |
1212 | |
1213 | +struct addrinfo; |
1214 | + |
1215 | namespace ScaleStack { |
1216 | namespace Network { |
1217 | + |
1218 | +class Module; |
1219 | + |
1220 | +} /* namespace Module */ |
1221 | +namespace Network { |
1222 | namespace IP { |
1223 | |
1224 | -/** |
1225 | - * Public functions |
1226 | - */ |
1227 | - |
1228 | class SCALESTACK_API Common |
1229 | { |
1230 | public: |
1231 | @@ -42,11 +41,13 @@ |
1232 | |
1233 | virtual ~Common(); |
1234 | |
1235 | - void processHostsandPorts(std::vector<std::pair<std::string,std::string>> hosts, |
1236 | - std::vector<std::string> ports, |
1237 | - const struct addrinfo* addrinfo_options); |
1238 | + void parseHosts(Kernel::Module& module, |
1239 | + const std::vector<std::pair<std::string,std::string> >& hosts, |
1240 | + const struct addrinfo& address_options, |
1241 | + bool local_only); |
1242 | |
1243 | - virtual void processAddrinfo(struct addrinfo* addrinfo); |
1244 | + virtual void addAddressList(const struct addrinfo* local, |
1245 | + const struct addrinfo* peer); |
1246 | |
1247 | private: |
1248 | |
1249 | @@ -61,17 +62,13 @@ |
1250 | */ |
1251 | SCALESTACK_LOCAL |
1252 | Common& operator=(const Common&); |
1253 | - |
1254 | - /** |
1255 | - * Add a struct addrinfo* for a host:port to addrinfos vector |
1256 | - */ |
1257 | - SCALESTACK_LOCAL |
1258 | - void _processAddrinfo(std::string host, std::string port, |
1259 | - const struct addrinfo* addrinfo_options); |
1260 | - |
1261 | }; |
1262 | |
1263 | -inline void Common::processAddrinfo(struct addrinfo*) |
1264 | +/* |
1265 | + * Public methods. |
1266 | + */ |
1267 | + |
1268 | +inline void Common::addAddressList(const struct addrinfo*, const struct addrinfo*) |
1269 | { |
1270 | } |
1271 | |
1272 | |
1273 | === modified file 'ScaleStack/Network/IP/TCP/ConnectionService.cc' |
1274 | --- ScaleStack/Network/IP/TCP/ConnectionService.cc 2010-05-04 08:58:05 +0000 |
1275 | +++ ScaleStack/Network/IP/TCP/ConnectionService.cc 2010-05-16 06:24:29 +0000 |
1276 | @@ -42,14 +42,14 @@ |
1277 | } |
1278 | |
1279 | Network::Stream* ConnectionService::addAccepted(int file_descriptor, |
1280 | - struct sockaddr& peer_address, |
1281 | - socklen_t) |
1282 | + struct sockaddr& peer, |
1283 | + socklen_t peer_size) |
1284 | { |
1285 | char host_name[NI_MAXHOST]; |
1286 | char port_name[NI_MAXSERV]; |
1287 | |
1288 | - int return_code = getnameinfo(&peer_address, |
1289 | - sizeof(struct sockaddr), |
1290 | + int return_code = getnameinfo(&peer, |
1291 | + peer_size, |
1292 | host_name, NI_MAXHOST, |
1293 | port_name, NI_MAXSERV, |
1294 | NI_NUMERICHOST | NI_NUMERICSERV); |
1295 | @@ -70,7 +70,7 @@ |
1296 | } |
1297 | |
1298 | Network::Stream* ConnectionService::addConnect(const std::string& host, |
1299 | - const std::string& port) |
1300 | + const std::string& port) |
1301 | { |
1302 | Connection* connection; |
1303 | Network::Stream* stream = _addConnection(&connection); |
1304 | |
1305 | === modified file 'ScaleStack/Network/IP/TCP/ConnectionService.h' |
1306 | --- ScaleStack/Network/IP/TCP/ConnectionService.h 2010-05-03 08:30:52 +0000 |
1307 | +++ ScaleStack/Network/IP/TCP/ConnectionService.h 2010-05-16 06:24:29 +0000 |
1308 | @@ -41,8 +41,8 @@ |
1309 | * See StreamService::addAccepted(). |
1310 | */ |
1311 | Network::Stream* addAccepted(int file_descriptor, |
1312 | - struct sockaddr& peer_address, |
1313 | - socklen_t peer_address_size); |
1314 | + struct sockaddr& peer, |
1315 | + socklen_t peer_size); |
1316 | |
1317 | /** |
1318 | * Add a new connection and connect to the given host:port. |
1319 | |
1320 | === modified file 'ScaleStack/Network/IP/UDP/Socket.cc' |
1321 | --- ScaleStack/Network/IP/UDP/Socket.cc 2010-05-03 00:23:08 +0000 |
1322 | +++ ScaleStack/Network/IP/UDP/Socket.cc 2010-05-16 06:24:29 +0000 |
1323 | @@ -15,15 +15,6 @@ |
1324 | |
1325 | #include "config.h" |
1326 | |
1327 | -#include <cerrno> |
1328 | -#include <cstring> |
1329 | -#include <sys/types.h> /* Must be before socket headers for FreeBSD. */ |
1330 | -#include <netinet/in.h> |
1331 | -#include <netinet/tcp.h> |
1332 | -#include <sys/socket.h> |
1333 | -#include <unistd.h> |
1334 | - |
1335 | -#include <ScaleStack/Kernel/Module.h> |
1336 | #include <ScaleStack/Network/IP/UDP/Socket.h> |
1337 | #include <ScaleStack/Network/IP/UDP/SocketService.h> |
1338 | |
1339 | @@ -49,7 +40,7 @@ |
1340 | |
1341 | void Socket::setFileDescriptor(int file_descriptor) |
1342 | { |
1343 | - /* any setsockopts go here */ |
1344 | + /* Any setsockopts go here. */ |
1345 | |
1346 | Network::DatagramProvider::setFileDescriptor(file_descriptor); |
1347 | } |
1348 | |
1349 | === modified file 'ScaleStack/Network/IP/UDP/SocketService.cc' |
1350 | --- ScaleStack/Network/IP/UDP/SocketService.cc 2010-05-04 08:58:05 +0000 |
1351 | +++ ScaleStack/Network/IP/UDP/SocketService.cc 2010-05-16 06:24:29 +0000 |
1352 | @@ -30,26 +30,18 @@ |
1353 | namespace IP { |
1354 | namespace UDP { |
1355 | |
1356 | -#define UDP_OPTION_HOSTS_NONE ":NONE" |
1357 | -#define UDP_OPTION_PORTS_NONE ":NONE" |
1358 | - |
1359 | -/* |
1360 | - * Public Functions. |
1361 | - */ |
1362 | - |
1363 | -void SocketOptions(Kernel::Module& module, const char* port) |
1364 | -{ |
1365 | - module.addOption("udp_hosts", "List of host/port pairs to bind.", |
1366 | - "HOST[:PORT][,HOST[:PORT]]...", |
1367 | - UDP_OPTION_HOSTS_NONE); |
1368 | - module.addOption("udp_ports", "List of ports to bind.", "PORT[,PORT]...", |
1369 | - port); |
1370 | -} |
1371 | - |
1372 | /* |
1373 | * Public methods. |
1374 | */ |
1375 | |
1376 | +void SocketService::Options(Kernel::Module& module, const char* hosts) |
1377 | +{ |
1378 | + module.addOption("hosts", |
1379 | + "List of host/port pairs.", |
1380 | + "[HOST][:PORT][,[HOST][:PORT]]...", |
1381 | + hosts); |
1382 | +} |
1383 | + |
1384 | SocketService::SocketService(Kernel::Module& module): |
1385 | DatagramService(module) |
1386 | { |
1387 | @@ -59,106 +51,81 @@ |
1388 | { |
1389 | } |
1390 | |
1391 | -struct addrinfo* SocketService::getaddrinfo(string host, string port) |
1392 | -{ |
1393 | - struct addrinfo *addrinfo_list; |
1394 | - struct addrinfo addrinfo_options; |
1395 | - |
1396 | - memset(&addrinfo_options, 0, sizeof(struct addrinfo)); |
1397 | - addrinfo_options.ai_flags = AI_PASSIVE; |
1398 | - addrinfo_options.ai_family = AF_UNSPEC; |
1399 | - addrinfo_options.ai_socktype = SOCK_DGRAM; |
1400 | - addrinfo_options.ai_protocol = IPPROTO_UDP; |
1401 | - |
1402 | - int return_code = ::getaddrinfo(host == "" ? NULL : host.c_str(), |
1403 | - port.c_str(), |
1404 | - &addrinfo_options, |
1405 | - &addrinfo_list); |
1406 | - if (return_code != 0) |
1407 | - { |
1408 | - _module.logFatal("Couldn't getaddrinfo for %s:%s", host.c_str(), port.c_str()); |
1409 | - } |
1410 | - |
1411 | - return addrinfo_list; |
1412 | -} |
1413 | - |
1414 | -void SocketService::freeaddrinfo(struct addrinfo *addrinfo) |
1415 | -{ |
1416 | - ::freeaddrinfo(addrinfo); |
1417 | -} |
1418 | - |
1419 | -void SocketService::addSocket(struct addrinfo *addrinfo) |
1420 | -{ |
1421 | - /* We only require one host:port pair from the list to succeed. */ |
1422 | - bool added = false; |
1423 | - for (; addrinfo != NULL; addrinfo = addrinfo->ai_next) |
1424 | - { |
1425 | - try |
1426 | - { |
1427 | - _addSocket(addrinfo); |
1428 | - added = true; |
1429 | - } |
1430 | - catch (exception&) |
1431 | - { |
1432 | - } |
1433 | - } |
1434 | - |
1435 | - if (!added) |
1436 | - { |
1437 | - _module.logFatal("Could not add any UDP sockets"); |
1438 | - } |
1439 | -} |
1440 | - |
1441 | -void SocketService::processSocketOptions(void) |
1442 | -{ |
1443 | - Kernel::Option& hosts_opt = _module.getOption("udp_hosts"); |
1444 | - Kernel::Option& ports_opt = _module.getOption("udp_ports"); |
1445 | - vector<pair<string,string> > hosts_list; |
1446 | - vector<string> ports_list; |
1447 | - |
1448 | - if (strcmp(hosts_opt.getValue().c_str(), UDP_OPTION_HOSTS_NONE)) |
1449 | - hosts_list = hosts_opt.getHostListValue(); |
1450 | - |
1451 | - if (strcmp(ports_opt.getValue().c_str(), UDP_OPTION_PORTS_NONE)) |
1452 | - ports_list = ports_opt.getListValue(); |
1453 | - |
1454 | - struct addrinfo addrinfo_options; |
1455 | - |
1456 | - memset(&addrinfo_options, 0, sizeof(struct addrinfo)); |
1457 | - addrinfo_options.ai_flags = AI_PASSIVE; |
1458 | - addrinfo_options.ai_family = AF_UNSPEC; |
1459 | - addrinfo_options.ai_socktype = SOCK_DGRAM; |
1460 | - addrinfo_options.ai_protocol = IPPROTO_UDP; |
1461 | - |
1462 | - processHostsandPorts(hosts_list, ports_list, &addrinfo_options); |
1463 | +void SocketService::addSockets(void) |
1464 | +{ |
1465 | + struct addrinfo address_options; |
1466 | + |
1467 | + memset(&address_options, 0, sizeof(struct addrinfo)); |
1468 | + address_options.ai_flags = AI_PASSIVE; |
1469 | + address_options.ai_family = AF_UNSPEC; |
1470 | + address_options.ai_socktype = SOCK_DGRAM; |
1471 | + address_options.ai_protocol = IPPROTO_UDP; |
1472 | + |
1473 | + parseHosts(_module, |
1474 | + _module.getOption("hosts").getHostListValue(), |
1475 | + address_options, |
1476 | + true); |
1477 | +} |
1478 | + |
1479 | +void SocketService::addSocketWithPeer(void) |
1480 | +{ |
1481 | + struct addrinfo address_options; |
1482 | + |
1483 | + memset(&address_options, 0, sizeof(struct addrinfo)); |
1484 | + address_options.ai_flags = AI_PASSIVE; |
1485 | + address_options.ai_family = AF_UNSPEC; |
1486 | + address_options.ai_socktype = SOCK_DGRAM; |
1487 | + address_options.ai_protocol = IPPROTO_UDP; |
1488 | + |
1489 | + parseHosts(_module, |
1490 | + _module.getOption("hosts").getHostListValue(), |
1491 | + address_options, |
1492 | + false); |
1493 | } |
1494 | |
1495 | /* |
1496 | * Private methods. |
1497 | */ |
1498 | |
1499 | -Network::Datagram* SocketService::_addSocket(struct addrinfo *addrinfo) |
1500 | +void SocketService::removeHandler(Event::Handler* handler) |
1501 | +{ |
1502 | + removeDatagram(reinterpret_cast<Socket*>(handler)->getDatagram()); |
1503 | + delete handler; |
1504 | +} |
1505 | + |
1506 | +Network::Datagram* SocketService::_addSocket(const struct addrinfo *local, |
1507 | + const struct addrinfo *peer) |
1508 | { |
1509 | Network::Datagram* datagram = NULL; |
1510 | Socket* socket = NULL; |
1511 | - |
1512 | char host_name[NI_MAXHOST]; |
1513 | char port_name[NI_MAXSERV]; |
1514 | int return_code; |
1515 | |
1516 | - return_code = getnameinfo(addrinfo->ai_addr, |
1517 | - addrinfo->ai_addrlen, |
1518 | - host_name, NI_MAXHOST, |
1519 | - port_name, NI_MAXSERV, |
1520 | - NI_NUMERICHOST | NI_NUMERICSERV); |
1521 | + if (local != NULL) |
1522 | + { |
1523 | + return_code = getnameinfo(local->ai_addr, |
1524 | + local->ai_addrlen, |
1525 | + host_name, NI_MAXHOST, |
1526 | + port_name, NI_MAXSERV, |
1527 | + NI_NUMERICHOST | NI_NUMERICSERV); |
1528 | + if (return_code == 0) |
1529 | + _module.logInfo("UDP socket bound to %s:%s", host_name, port_name); |
1530 | + else |
1531 | + _module.logInfo("Failed getnameinfo: %s", gai_strerror(return_code)); |
1532 | + } |
1533 | |
1534 | - if (return_code == 0) |
1535 | - { |
1536 | - _module.logInfo("Adding UDP socket bound to %s:%s", host_name, port_name); |
1537 | - } |
1538 | - else |
1539 | - { |
1540 | - _module.logInfo("Adding UDP socket bound to <unknown>"); |
1541 | + if (peer != NULL) |
1542 | + { |
1543 | + return_code = getnameinfo(peer->ai_addr, |
1544 | + peer->ai_addrlen, |
1545 | + host_name, NI_MAXHOST, |
1546 | + port_name, NI_MAXSERV, |
1547 | + NI_NUMERICHOST | NI_NUMERICSERV); |
1548 | + if (return_code == 0) |
1549 | + _module.logInfo("UDP socket with peer %s:%s", host_name, port_name); |
1550 | + else |
1551 | + _module.logInfo("Failed getnameinfo: %s", gai_strerror(return_code)); |
1552 | } |
1553 | |
1554 | try |
1555 | @@ -176,21 +143,44 @@ |
1556 | throw; |
1557 | } |
1558 | |
1559 | - socket->bind(*addrinfo); |
1560 | + if (local == NULL) |
1561 | + { |
1562 | + socket->create(peer->ai_family); |
1563 | + socket->setPeer(*(peer->ai_addr), peer->ai_addrlen); |
1564 | + } |
1565 | + else |
1566 | + socket->bind(*(local->ai_addr), local->ai_addrlen); |
1567 | + |
1568 | socket->ready(); |
1569 | |
1570 | return datagram; |
1571 | } |
1572 | |
1573 | -void SocketService::removeHandler(Event::Handler* handler) |
1574 | -{ |
1575 | - removeDatagram(reinterpret_cast<Socket*>(handler)->getDatagram()); |
1576 | - delete handler; |
1577 | -} |
1578 | - |
1579 | -void SocketService::processAddrinfo(struct addrinfo *addrinfo) |
1580 | -{ |
1581 | - addSocket(addrinfo); |
1582 | +void SocketService::addAddressList(const struct addrinfo* local, |
1583 | + const struct addrinfo* peer) |
1584 | +{ |
1585 | + if (local == NULL) |
1586 | + { |
1587 | + _addSocket(NULL, peer); |
1588 | + return; |
1589 | + } |
1590 | + |
1591 | + /* We only require one local address from the list to succeed. */ |
1592 | + bool added = false; |
1593 | + for (; local != NULL; local = local->ai_next) |
1594 | + { |
1595 | + try |
1596 | + { |
1597 | + _addSocket(local, peer); |
1598 | + added = true; |
1599 | + } |
1600 | + catch (exception&) |
1601 | + { |
1602 | + } |
1603 | + } |
1604 | + |
1605 | + if (!added) |
1606 | + _module.logFatal("Could not add any UDP sockets"); |
1607 | } |
1608 | |
1609 | } /* namespace UDP */ |
1610 | |
1611 | === modified file 'ScaleStack/Network/IP/UDP/SocketService.h' |
1612 | --- ScaleStack/Network/IP/UDP/SocketService.h 2010-05-04 01:00:14 +0000 |
1613 | +++ ScaleStack/Network/IP/UDP/SocketService.h 2010-05-16 06:24:29 +0000 |
1614 | @@ -34,58 +34,33 @@ |
1615 | |
1616 | class Socket; |
1617 | |
1618 | - |
1619 | -/** |
1620 | - * Add common options for binding UDP sockets. |
1621 | - * |
1622 | - * @param[in] module Module that the service is associated with. |
1623 | - * @param[in] port Default port to use. |
1624 | - */ |
1625 | -SCALESTACK_API |
1626 | -void SocketOptions(Kernel::Module& module, const char* port); |
1627 | - |
1628 | - |
1629 | class SCALESTACK_API SocketService: public DatagramService, public Common |
1630 | { |
1631 | public: |
1632 | |
1633 | + /** |
1634 | + * Add common options for binding UDP sockets. |
1635 | + * |
1636 | + * @param[in] module Module that the service is associated with. |
1637 | + * @param[in] hosts Default hosts to use. |
1638 | + */ |
1639 | + static void Options(Kernel::Module& module, const char* hosts); |
1640 | + |
1641 | SocketService(Kernel::Module& module); |
1642 | |
1643 | virtual ~SocketService(); |
1644 | |
1645 | /** |
1646 | - * Free the addrinfos vector |
1647 | - * @param[in] addrinfos The vector to free. |
1648 | - */ |
1649 | - void freeaddrinfos(std::vector<struct addrinfo*> addrinfos); |
1650 | - |
1651 | - /** |
1652 | - * Return a struct addrinfo* from a single host and port |
1653 | - * |
1654 | - * @param[in] host Host part of the address |
1655 | - * @param[in] port Port part of the address |
1656 | - * @return The full address |
1657 | - */ |
1658 | - struct addrinfo* getaddrinfo(std::string host, std::string port); |
1659 | - |
1660 | - /** |
1661 | - * Free a struct addrinfo* |
1662 | - */ |
1663 | - void freeaddrinfo(struct addrinfo* addrinfo); |
1664 | - |
1665 | - /** |
1666 | - * Create a new UDP socket and bind it. |
1667 | - * |
1668 | - * @param[in] addrinfos A list of addresses to try to to bind |
1669 | - * @param[in] watch_write True if we need to write data immediately |
1670 | - */ |
1671 | - void addSocket(struct addrinfo *addrinfo); |
1672 | - |
1673 | - /** |
1674 | - * Process the socket options previously added via |
1675 | - * 'SocketService::SocketOptions' |
1676 | - */ |
1677 | - void processSocketOptions(void); |
1678 | + * Add sockets specified by the 'hosts' variable in the module options |
1679 | + * and bind to those addresses. |
1680 | + */ |
1681 | + void addSockets(void); |
1682 | + |
1683 | + /** |
1684 | + * Add sockets specified by the 'hosts' variable in the module options |
1685 | + * and use those addresses as peers. |
1686 | + */ |
1687 | + void addSocketWithPeer(void); |
1688 | |
1689 | private: |
1690 | |
1691 | @@ -102,25 +77,24 @@ |
1692 | SocketService& operator=(const SocketService&); |
1693 | |
1694 | /** |
1695 | - * Create a new UDP socket and bind to the given address. |
1696 | - * |
1697 | - * @param[in] addrinfo Address to bind. |
1698 | - */ |
1699 | - SCALESTACK_LOCAL |
1700 | - Network::Datagram* _addSocket(struct addrinfo *addrinfo); |
1701 | - |
1702 | - /** |
1703 | * See Event::Service::removeHandler(). |
1704 | */ |
1705 | void removeHandler(Event::Handler* handler); |
1706 | |
1707 | /** |
1708 | - * See Network::IP::Common::processAddrinfo() |
1709 | - * This implements a method from a base class, so it has no leading |
1710 | - * underscore. |
1711 | + * Create a new UDP socket and bind to the given address. |
1712 | + * |
1713 | + * @param[in] local Local address to bind to. |
1714 | + * @param[in] peer Default peer address to send to. |
1715 | */ |
1716 | - void processAddrinfo(struct addrinfo* addrinfo); |
1717 | + SCALESTACK_LOCAL |
1718 | + Network::Datagram* _addSocket(const struct addrinfo *local, |
1719 | + const struct addrinfo *peer); |
1720 | |
1721 | + /** |
1722 | + * See Network::IP::Common::addAddressList(). |
1723 | + */ |
1724 | + void addAddressList(const struct addrinfo* local, const struct addrinfo* peer); |
1725 | }; |
1726 | |
1727 | } /* namespace UDP */ |
1728 | |
1729 | === modified file 'ScaleStack/Network/StreamService.h' |
1730 | --- ScaleStack/Network/StreamService.h 2010-05-03 08:30:52 +0000 |
1731 | +++ ScaleStack/Network/StreamService.h 2010-05-16 06:24:29 +0000 |
1732 | @@ -53,13 +53,13 @@ |
1733 | * Add a new stream that has been accepted. |
1734 | * |
1735 | * @param[in] file_descriptor File descriptor for the new stream. |
1736 | - * @param[in] peer_address Address information for the remote peer. |
1737 | - * @param[in] peer_address_size Size of peer_address structure. |
1738 | + * @param[in] peer Address information for the remote peer. |
1739 | + * @param[in] peer_size Size of peer structure. |
1740 | * @return Stream that was added. |
1741 | */ |
1742 | virtual Network::Stream* addAccepted(int file_descriptor, |
1743 | - struct sockaddr& peer_address, |
1744 | - socklen_t peer_address_size) = 0; |
1745 | + struct sockaddr& peer, |
1746 | + socklen_t peer_size) = 0; |
1747 | |
1748 | private: |
1749 | |
1750 | |
1751 | === modified file 'ScaleStack/Network/Unix/Stream/Connection.h' |
1752 | --- ScaleStack/Network/Unix/Stream/Connection.h 2010-04-30 03:54:30 +0000 |
1753 | +++ ScaleStack/Network/Unix/Stream/Connection.h 2010-05-16 06:24:29 +0000 |
1754 | @@ -61,8 +61,7 @@ |
1755 | /** |
1756 | * Connect to a remote host. |
1757 | * |
1758 | - * @param[in] host Host to connect to. |
1759 | - * @param[in] port Port to connect to. |
1760 | + * @param[in] socket_name Socket to connect to. |
1761 | */ |
1762 | void connect(const std::string& socket_name); |
1763 | |
1764 | |
1765 | === modified file 'ScaleStack/Network/Unix/Stream/ConnectionService.h' |
1766 | --- ScaleStack/Network/Unix/Stream/ConnectionService.h 2010-05-03 08:30:52 +0000 |
1767 | +++ ScaleStack/Network/Unix/Stream/ConnectionService.h 2010-05-16 06:24:29 +0000 |
1768 | @@ -41,8 +41,8 @@ |
1769 | * See StreamService::addAccepted(). |
1770 | */ |
1771 | Network::Stream* addAccepted(int file_descriptor, |
1772 | - struct sockaddr& peer_address, |
1773 | - socklen_t peer_address_size); |
1774 | + struct sockaddr& peer, |
1775 | + socklen_t peer_size); |
1776 | |
1777 | /** |
1778 | * Add a new connection and connect to the given Unix Domain Socket. |
1779 | |
1780 | === modified file 'ScaleStack/Network/Unix/Stream/Listener.h' |
1781 | --- ScaleStack/Network/Unix/Stream/Listener.h 2010-04-30 00:03:45 +0000 |
1782 | +++ ScaleStack/Network/Unix/Stream/Listener.h 2010-05-16 06:24:29 +0000 |
1783 | @@ -40,7 +40,7 @@ |
1784 | * @param[in] service Service this Listener is associated with. |
1785 | * @param[in] connection_service Service this Listener should add |
1786 | * connections to when accepted. |
1787 | - * @param[in] addrinfo Address information to use for socket. |
1788 | + * @param[in] unix_socket Address information to use for socket. |
1789 | */ |
1790 | Listener(ListenerService& service, |
1791 | ConnectionService& connection_service, |
Reviewed the diff and it looks sane to me. Ship it!