223 lines
9.8 KiB
C++
Executable File
223 lines
9.8 KiB
C++
Executable File
#if !defined (_CDEV_SESSION_MANAGER_H_)
|
|
#define _CDEV_SESSION_MANAGER_H_
|
|
|
|
#include "cdevReactor.h"
|
|
#include "cdevEventHandler.h"
|
|
#include "cdevAddr.h"
|
|
#include "cdevSocketStream.h"
|
|
|
|
#include "ErrorReporter.h"
|
|
#include "FD_Trigger.h"
|
|
#include "fifo.h"
|
|
#include "IntHash.h"
|
|
#include "cdevPacket.h"
|
|
|
|
// *****************************************************************************
|
|
// * class ClientSession :
|
|
// *
|
|
// * The ClientSession allows the server to associate certain data
|
|
// * with a specific client...
|
|
// *
|
|
// * The ClientSession object may be sub-classed later in order to allow the
|
|
// * developer to attach additional information to a particular client id.
|
|
// *
|
|
// * localID : This is the short integer that uniquely identifies the
|
|
// * client on the server side of the connection.
|
|
// *
|
|
// * clientID : This is an integer that uniquely identifies the client
|
|
// * within the context of the socket... That is to say...
|
|
// *
|
|
// * The high-order short integer is the socketID - AND -
|
|
// * the low-order short integer is a clientID that uniquely
|
|
// * identifies the client on the client side of the connection.
|
|
// *
|
|
// * Even though both the clientID and the localID uniquely
|
|
// * identify the client... both are maintained in order to
|
|
// * perform bi-directional routing of packets between multiple
|
|
// * repeaters.
|
|
// *
|
|
// * socketID : This is the socket number that the client is attached on.
|
|
// *
|
|
// * context: This is a pointer to the most recently used context from the
|
|
// * cdevContextMap.
|
|
// *****************************************************************************
|
|
class GENERIC_SERVER_API ClientSession
|
|
{
|
|
private:
|
|
short localID;
|
|
int clientID;
|
|
int socketID;
|
|
|
|
public:
|
|
ClientSession ( int SocketID, int ClientID, int LocalID );
|
|
virtual ~ClientSession ( void );
|
|
int getSocketID ( void ) { return socketID; }
|
|
void setSocketID ( int SocketID ) { socketID = SocketID; }
|
|
int getClientID ( void ) { return clientID; }
|
|
void setClientID ( int ClientID ) { clientID = ClientID; }
|
|
short getLocalID ( void ) { return localID; }
|
|
void setLocalID ( short LocalID ) { localID = LocalID; }
|
|
};
|
|
|
|
|
|
// *****************************************************************************
|
|
// * class SocketSession :
|
|
// * This class is a queue that will feed to a specific socket in that is
|
|
// * connected to a remote client. The class contains the following variables.
|
|
// *
|
|
// * The SocketSession object may be sub-classed later in order to allow the
|
|
// * developer to attach additional information to a particular socket.
|
|
// *
|
|
// * socketID : the integer identifier of the socket
|
|
// *
|
|
// * contextMap : a table of cdevData contexts that can be retrieved by index
|
|
// *
|
|
// * tagMap : the table for mapping cdevData tags from the remote system
|
|
// * to the tag table associated with this system.
|
|
// *****************************************************************************
|
|
class GENERIC_SERVER_API SocketSession : public FifoQueue
|
|
{
|
|
private:
|
|
int socketID;
|
|
|
|
public:
|
|
SocketSession ( int SocketID );
|
|
virtual ~SocketSession ( void );
|
|
int getSocketID ( void ) { return socketID; }
|
|
void setSocketID ( int SocketID ) { socketID = SocketID; }
|
|
};
|
|
|
|
|
|
|
|
// *****************************************************************************
|
|
// * class cdevSessionManager:
|
|
// * The cdevSessionManager class is used to manage the queues that are
|
|
// * associated with the operation of a server. It maintains the following
|
|
// * variables.
|
|
// *
|
|
// * Reactor : This is the cdevReactor that will be used to manage the client
|
|
// * connections.
|
|
// *
|
|
// * localIdx : This is the next available local index. This value will be
|
|
// * used to populate the localID variable in each ClientSession.
|
|
// *
|
|
// *
|
|
// * trigger : This is the file descriptor mechanism that is used to
|
|
// * notify the cdevEventHandler mechanisms when a packet
|
|
// * is available to be dequeued.
|
|
// *
|
|
// * rate : This is the rate at which the handleTimeout mechanism will
|
|
// * be periodically called in order to process time oriented
|
|
// * events.
|
|
// *
|
|
// * inbound : This is the inbound message queue. Since all messages will
|
|
// * go to the same method to be processed, they can be enqueued
|
|
// * in the same queue for storage.
|
|
// *
|
|
// * clients : This is a hash table that contains the queues for each
|
|
// * client that is attached to the server. Since multiple
|
|
// * clients can be routed through the same socket, these
|
|
// * classes are used to determine which socket to send the
|
|
// * outbound message to.
|
|
// *
|
|
// * sockets : This is the hash table that contains the queues for each
|
|
// * socket. After the cdevSessionManager determines the clientID
|
|
// * associated with an outbound message, that value will be used
|
|
// * to locate the SocketSession - where the outbound message will
|
|
// * be enqueued.
|
|
// *****************************************************************************
|
|
class GENERIC_SERVER_API cdevSessionManager : public ErrorReporter, public cdevEventHandler
|
|
{
|
|
public:
|
|
static cdevReactor Reactor;
|
|
|
|
protected:
|
|
static IntHash localIdx;
|
|
|
|
FD_Trigger trigger;
|
|
FifoQueue inbound;
|
|
IntHash clients;
|
|
IntHash sockets;
|
|
|
|
public:
|
|
cdevSessionManager ( void ) {}
|
|
virtual ~cdevSessionManager ( void );
|
|
|
|
static short getNextLocalID ( void );
|
|
|
|
// *********************************************************************
|
|
// * These mechanisms are used to obtain new ClientSession and
|
|
// * SocketSession objects. This design allows the developer to affix
|
|
// * addition socket specific or client specific components to his
|
|
// * classes later in order to have an easily accessable data point.
|
|
// *********************************************************************
|
|
virtual ClientSession * newClientSession ( int SocketID, int ClientID, int LocalID );
|
|
virtual SocketSession * newSocketSession ( int SocketID );
|
|
virtual void deleteSocketSession ( SocketSession * session );
|
|
// *********************************************************************
|
|
// * These mechanisms are used to add, locate and remove client and
|
|
// * socket sessions.
|
|
// *********************************************************************
|
|
virtual ClientSession * findLocalClient ( short localID );
|
|
virtual ClientSession * findClient ( int clientID );
|
|
virtual SocketSession * findSocket ( int socketID );
|
|
virtual ClientSession * addClient ( int socketID, int clientID );
|
|
virtual SocketSession * addSocket ( int socketID );
|
|
virtual void removeClient ( int clientID, int unregisterFlag=1);
|
|
virtual void removeSocket ( int socketID );
|
|
|
|
// *********************************************************************
|
|
// * This mechanism is used by the ClientHandler class to enqueue binary
|
|
// * information incoming from the socket.
|
|
// *********************************************************************
|
|
virtual int enqueue ( int socketID, char * binary, unsigned binaryLen );
|
|
|
|
// *********************************************************************
|
|
// * This method is used by the developer to send a packet to a specific
|
|
// * client. The client is specified by the clientID in the cdevPacket.
|
|
// *********************************************************************
|
|
virtual int enqueue ( cdevPacket * packet );
|
|
|
|
// *********************************************************************
|
|
// * This method is used by the developer to extract a packet from the
|
|
// * inbound queue for processing.
|
|
// *********************************************************************
|
|
int dequeue ( cdevPacket * &packet );
|
|
|
|
// *********************************************************************
|
|
// * This method is used by the developer to dequeue, process and then
|
|
// * enqueue messages to a client.
|
|
// *********************************************************************
|
|
virtual void processMessages ( void );
|
|
|
|
// *********************************************************************
|
|
// * This method formats packets when they are being enqueued or
|
|
// * dequeued.
|
|
// *********************************************************************
|
|
virtual cdevPacket * decodePacket (cdevPacketBinary * input);
|
|
virtual cdevPacketBinary * encodePacket (cdevPacket * input);
|
|
|
|
// *********************************************************************
|
|
// * These are the ACE_Event_Handler methods that are called whenever
|
|
// * a timeout, input or output event occur.
|
|
// *********************************************************************
|
|
virtual int getHandle (void) const;
|
|
virtual int handleInput (void);
|
|
virtual int handleClose (void);
|
|
virtual int handleTimeout (void);
|
|
|
|
// *********************************************************************
|
|
// * These are developer defined functions which are used to announce
|
|
// * the creation of a new client or the destruction of an existing
|
|
// * client to the main processing loop.
|
|
// *
|
|
// * Typically, they will only enqueue a message in the server specific
|
|
// * packet format that specifies either "register" or "unregister" and
|
|
// * the local client identifier.
|
|
// *********************************************************************
|
|
virtual void registerClient ( short localID ) = 0;
|
|
virtual void unregisterClient ( short localID ) = 0;
|
|
};
|
|
|
|
#endif /* _CDEV_SESSION_MANAGER_H_ */
|