Mercurial > projects > ldc
comparison tango/tango/net/ServerSocket.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /******************************************************************************* | |
2 | |
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved | |
4 | |
5 license: BSD style: $(LICENSE) | |
6 | |
7 version: Initial release: March 2004 | |
8 Outback release: December 2006 | |
9 | |
10 author: Kris | |
11 | |
12 *******************************************************************************/ | |
13 | |
14 module tango.net.ServerSocket; | |
15 | |
16 private import tango.net.Socket, | |
17 tango.net.SocketConduit; | |
18 | |
19 private import tango.io.model.IConduit; | |
20 | |
21 public import tango.net.InternetAddress; | |
22 | |
23 /******************************************************************************* | |
24 | |
25 ServerSocket is a wrapper upon the basic socket functionality to | |
26 simplify the API somewhat. You use a ServerSocket to listen for | |
27 inbound connection requests, and get back a SocketConduit when a | |
28 connection is made. | |
29 | |
30 Accepted SocketConduit instances are held in a free-list to help | |
31 avoid heap activity. These instances are recycled upon invoking | |
32 the close() method, and one should ensure that occurs | |
33 | |
34 *******************************************************************************/ | |
35 | |
36 class ServerSocket : ISelectable | |
37 { | |
38 private Socket socket_; | |
39 private int linger = -1; | |
40 | |
41 /*********************************************************************** | |
42 | |
43 Construct a ServerSocket on the given address, with the | |
44 specified number of backlog connections supported. The | |
45 socket is bound to the given address, and set to listen | |
46 for incoming connections. Note that the socket address | |
47 can be setup for reuse, so that a halted server may be | |
48 restarted immediately. | |
49 | |
50 ***********************************************************************/ | |
51 | |
52 this (InternetAddress addr, int backlog=32, bool reuse=false) | |
53 { | |
54 socket_ = new Socket (AddressFamily.INET, SocketType.STREAM, ProtocolType.IP); | |
55 socket_.setAddressReuse(reuse).bind(addr).listen(backlog); | |
56 } | |
57 | |
58 /*********************************************************************** | |
59 | |
60 Models a handle-oriented device. | |
61 | |
62 TODO: figure out how to avoid exposing this in the general | |
63 case | |
64 | |
65 ***********************************************************************/ | |
66 | |
67 Handle fileHandle () | |
68 { | |
69 return cast(Handle) socket_.fileHandle; | |
70 } | |
71 | |
72 /*********************************************************************** | |
73 | |
74 Set the period in which dead sockets are left lying around | |
75 by the O/S | |
76 | |
77 ***********************************************************************/ | |
78 | |
79 void setLingerPeriod (int period) | |
80 { | |
81 linger = period; | |
82 } | |
83 | |
84 /*********************************************************************** | |
85 | |
86 Return the wrapped socket | |
87 | |
88 ***********************************************************************/ | |
89 | |
90 Socket socket () | |
91 { | |
92 return socket_; | |
93 } | |
94 | |
95 /*********************************************************************** | |
96 | |
97 Is this server still alive? | |
98 | |
99 ***********************************************************************/ | |
100 | |
101 bool isAlive () | |
102 { | |
103 return socket_.isAlive; | |
104 } | |
105 | |
106 /*********************************************************************** | |
107 | |
108 Wait for a client to connect to us, and return a connected | |
109 SocketConduit. | |
110 | |
111 ***********************************************************************/ | |
112 | |
113 SocketConduit accept () | |
114 { | |
115 auto wrapper = SocketConduit.allocate(); | |
116 auto accepted = socket_.accept (wrapper.socket); | |
117 | |
118 // force abortive closure to avoid prolonged OS scavenging? | |
119 if (linger >= 0) | |
120 accepted.setLingerPeriod (linger); | |
121 | |
122 return wrapper; | |
123 } | |
124 } |