diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-04-03 03:49:53 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-04-03 03:49:53 +0000 |
commit | f4c20290509d7ed3a8fd5304577e7a4cc0b9d974 (patch) | |
tree | 13cdf64f7cf134f397a7165b7a3fe0807e37026b /src/old/connectionmanager.h | |
parent | 74d4c8cd27334fc7204d5a8773deb3d424565778 (diff) | |
download | libbu++-f4c20290509d7ed3a8fd5304577e7a4cc0b9d974.tar.gz libbu++-f4c20290509d7ed3a8fd5304577e7a4cc0b9d974.tar.bz2 libbu++-f4c20290509d7ed3a8fd5304577e7a4cc0b9d974.tar.xz libbu++-f4c20290509d7ed3a8fd5304577e7a4cc0b9d974.zip |
Ok, no code is left in src, it's all in src/old. We'll gradually move code back
into src as it's fixed and re-org'd. This includes tests, which, I may write a
unit test system into libbu++ just to make my life easier.
Diffstat (limited to 'src/old/connectionmanager.h')
-rw-r--r-- | src/old/connectionmanager.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/old/connectionmanager.h b/src/old/connectionmanager.h new file mode 100644 index 0000000..cff036b --- /dev/null +++ b/src/old/connectionmanager.h | |||
@@ -0,0 +1,169 @@ | |||
1 | /** | ||
2 | *@file | ||
3 | * Contains the ConnectionManager. | ||
4 | *@author Mike Buland | ||
5 | */ | ||
6 | |||
7 | #ifndef CONNECTIONMANAGER_H | ||
8 | #define CONNECTIONMANAGER_H | ||
9 | |||
10 | #include "multilog.h" | ||
11 | #include "connection.h" | ||
12 | #include "connectionmonitor.h" | ||
13 | #include <sys/types.h> | ||
14 | #include <list> | ||
15 | #include <map> | ||
16 | |||
17 | /** Manges incoming network connections as a server. Creates and works with | ||
18 | * Connection objects. All operations are performed on TCP/IP v4 right now, | ||
19 | * and on a single port, although any number of connections can be handled. | ||
20 | *@author Mike Buland | ||
21 | */ | ||
22 | class ConnectionManager | ||
23 | { | ||
24 | public: | ||
25 | /** | ||
26 | * Sets up the basics, like storage for the pool, and so on. This does not | ||
27 | * actually start a server, bind to a port, or create a connection pool. | ||
28 | * That's all handled by startServer(). | ||
29 | */ | ||
30 | ConnectionManager( int nInitPool=40 ); | ||
31 | |||
32 | /** | ||
33 | * Cleans up everything, and even clears out all still-connected Connection | ||
34 | * objects. | ||
35 | */ | ||
36 | virtual ~ConnectionManager(); | ||
37 | |||
38 | /** | ||
39 | * Starts a server socket and binds to it, listening for new connections. | ||
40 | * Unlike the version of this that takes two parameters, this listens on | ||
41 | * all local addresses, or the virtual 0.0.0.0 address if available, which | ||
42 | * is mapped to all active local addresses. | ||
43 | *@param nPort The port to listen on. | ||
44 | *@returns True if the socket was bound to the port and serving was | ||
45 | * started. False if there was a problem connecting to the port. | ||
46 | */ | ||
47 | bool startServer( int nPort ); | ||
48 | |||
49 | /** | ||
50 | * Starts a server socket and binds to it, listening only on the address | ||
51 | * specified. If you want to listen to all local addresses you can enter | ||
52 | * "0.0.0.0" for the address, but the version of this with one parameter | ||
53 | * is more universal. | ||
54 | *@param sAddr The local ip address to bind to | ||
55 | *@param nPort The port to listen on. | ||
56 | *@returns True if the socket was bound to the port and serving was | ||
57 | * started. False if there was a problem connecting to the port. | ||
58 | */ | ||
59 | bool startServer( const char *sAddr, int nPort ); | ||
60 | |||
61 | /** | ||
62 | * I recomend probably not using this function on your own too much, it | ||
63 | * does the real work of setting up a socket, but requires a properly | ||
64 | * prepared sackaddr_in structure. This isn't too hard, but it's easier | ||
65 | * to use the other startServer functions. They call this function after | ||
66 | * some prepwork. | ||
67 | *@param name A properly formed sockaddr_in structure that will not be | ||
68 | * modified, but describes how to listen and to what to listen. | ||
69 | *@returns True on success. | ||
70 | */ | ||
71 | bool startServer( struct sockaddr_in &name ); | ||
72 | |||
73 | /** | ||
74 | * This is identicle to the simpler startServer function except that it | ||
75 | * will automatically try to connect multiple times in case the first | ||
76 | * attempt or two doesn't work for some reason. Initially this was | ||
77 | * written to compensate for server sockets staying locked after they were | ||
78 | * closed for a while. | ||
79 | *@param nPort The port to listen on. | ||
80 | *@param nInitPool The size of the initial connection pool. This will | ||
81 | * grow automatically if necesarry. | ||
82 | *@param nNumTries The maximum number of times to try to connect. | ||
83 | *@param nTimeout The amount of time to wait in-between connection | ||
84 | * attempts. | ||
85 | *@returns True if the socket was bound to the port and serving was | ||
86 | * started. False if there was a problem connecting to the port. | ||
87 | */ | ||
88 | bool startServer( int nPort, int nNumTries, int nTimeout ); | ||
89 | |||
90 | /** | ||
91 | * Scans all open connections, halting the calling processes until data | ||
92 | * is received or nTimeout ms have gone by. While waiting for the timeout | ||
93 | * to complete the process is placed into an idle mode. | ||
94 | *@param nTimeout The number of millisecconds to wait if there is nothing | ||
95 | * to actually do. | ||
96 | *@param bForceTimeout If set to true, this will force the scanner to wait | ||
97 | * for the timout to complete before returning, even if there was pending | ||
98 | * data. | ||
99 | */ | ||
100 | bool scanConnections( int nTimeout, bool bForceTimeout ); | ||
101 | |||
102 | /** Shutdown the server and all assosiated sockets. | ||
103 | *@returns True if every socket was closed without problem. | ||
104 | */ | ||
105 | bool shutdownServer(); | ||
106 | |||
107 | /** Sends a message directly to every connected port. | ||
108 | *@param lpData A null-terminated string of data to send. | ||
109 | *@param nExcludeSocket An optional socket to exclude from the broadcast. | ||
110 | *@returns True if every socket that should have gotten the message did. | ||
111 | */ | ||
112 | bool broadcastMessage( const char *lpData, int nExcludeSocket=-1 ); | ||
113 | |||
114 | /** Sets a monitor for the manager. The monitor is sent notifications | ||
115 | * whenever a socket is connected, disconnected, or whenever an error | ||
116 | * occurs. | ||
117 | *@param pNewMonitor A pointer to a preconstructed ConnectionMonitor | ||
118 | */ | ||
119 | void setConnectionMonitor( ConnectionMonitor *pNewMonitor ); | ||
120 | |||
121 | void connect( const char *lpAddress, int nPort, int nProtocolPort, Protocol *pNewProto ); | ||
122 | |||
123 | private: | ||
124 | /** | ||
125 | * Take care of the work of actually accepting a connection. This will | ||
126 | * accept the connection, set the initial modes, and add it to the master | ||
127 | * list of active connections, as well as fire off any messages that need | ||
128 | * to be handled by anything else. | ||
129 | *@param nSocket The handle of the listening socket that had an incoming | ||
130 | * connection. | ||
131 | *@returns True if everything worked, False otherwise. | ||
132 | */ | ||
133 | bool addConnection( int nSocket ); | ||
134 | |||
135 | /** | ||
136 | * Seraches the internal lists of connections for one with a specific | ||
137 | * socket. | ||
138 | *@param nSocket The socket the connection is using for communication. | ||
139 | * This is the unique socket and not the one that the connection was | ||
140 | * initially to. | ||
141 | *@returns NULL if no connection was found, otherwise a pointer to a live | ||
142 | * Connection object. | ||
143 | */ | ||
144 | Connection *findActiveConnection( int nSocket ); | ||
145 | |||
146 | /** | ||
147 | * Searches the connection pool for an object that isn't in use yet, and | ||
148 | * returns it, ready to be filled in and used. | ||
149 | *@returns An unused connection object ready for use. | ||
150 | *@todo Check this code over to insure that the pool grows appropriately | ||
151 | * when enough extra connections are detected. | ||
152 | */ | ||
153 | Connection *getInactiveConnection(); | ||
154 | |||
155 | std::map<int,int> sMasterSocket; | ||
156 | //int nMasterSocket; /**< The listening or server socket. */ | ||
157 | fd_set fdActive; /**< The active socket set. */ | ||
158 | fd_set fdRead; /**< The sockets ready for a read. */ | ||
159 | fd_set fdWrite; /**< The sockets ready for a write. */ | ||
160 | fd_set fdException; /**< The sockets that have gotten errors. */ | ||
161 | std::list<Connection *> lInactive; /**< The pool of inactive Connections */ | ||
162 | std::list<Connection *> lActive; /**< The pool of active Connections */ | ||
163 | MultiLog &xLog; /**< A handle to the active multilog. */ | ||
164 | |||
165 | /** The ConnectionMonitor to notify of new connections. */ | ||
166 | ConnectionMonitor *pMonitor; | ||
167 | }; | ||
168 | |||
169 | #endif | ||