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 | ||
