#include <CAVERNnet_tcpReflector_c.hxx>
Public Methods | |
CAVERNnet_tcpReflector_c () | |
~CAVERNnet_tcpReflector_c () | |
int | init (int incomingPort=TCP_REFLECTOR_DEFAULT_PORT, int maxClients=64, char *forwardAddr=NULL, unsigned short forwardPort=0) |
int | process () |
int | checkForNewClients () |
int | setForcedDestination (char *ipAddr, unsigned short port) |
void | sendToAll (char *buffer, int dataSize) |
void | intercept (int(*callback)(CAVERNnet_tcpReflectorClient_c *client, char **buffer, int *bufferSize, void *userData), void *userData) |
void | interceptNewConnection (void(*callback)(CAVERNnet_tcpReflectorClient_c *newClient, void *userData), void *userData) |
void | showStats (char *streamInfo, char *comment) |
int | logStats (char *streamInfo, char *comment, FILE *filePtr) |
int | sendStats (char *streamInfo, char *comment) |
int | initSendStats (char *monitorClientIP, int port=PERF_DAEMON_DEFAULT_PORT) |
void | exitSendStats () |
Static Public Attributes | |
const int | OK |
Status ok. | |
const int | FAILED |
Status failed. | |
const int | MEM_ALLOC_ERR |
Memory allocation error. | |
const int | NEW_CONNECTION_ESTABLISHED |
New client has been connected. | |
const int | TOO_MANY_CLIENTS |
Reflector cannot handle any more connections. | |
const int | NO_NEW_CONNECTION |
No new connection. | |
const int | NON_BLOCKING_HAS_NO_DATA |
A non-blocking read had no data available to read. | |
const int | SKIP_DISTRIBUTION |
Skip the data distribution process. Used in user callback. See intercept(). | |
const int | DEFAULT_PORT |
Private Methods | |
int | distributeDataExceptTo (int clientToIgnore, char *buf, int incomingSize) |
void | removeClient (int clientNum) |
void | closeDownSockets () |
int | addNewClient (CAVERNnet_tcpReflectorClient_c *newClient) |
Private Attributes | |
CAVERNnet_tcpReflectorClient_c** | clients |
CAVERNnet_tcpServer_c* | server |
unsigned short | incomingPort |
char* | perfDaemonIP |
int | perfDaemonPort |
int | perfDaemonStatus |
int (* | interceptCallback )(CAVERNnet_tcpReflectorClient_c *newClient, char **buffer, int *bufsize, void *userData) |
void* | interceptUserData |
void (* | interceptNewConnectionCallback )(CAVERNnet_tcpReflectorClient_c *newClient, void *userData) |
void* | interceptNewConnectionUserData |
int | maxNumClients |
checkForNewClients is called everytime process() is called. If you want the check to be done more frequently you need to do it yourself. Similarly if you want the process() call done more frequently it is up to you to do it. I recommend threading those two off and setting up a mutex so that you do not do process() and checkForNewClients() at the same time.
|
Call this as often as you wish to check for new clients. Note. If you do this in a separate thread then you must set up a mutex so that you do not call the proces() call and this call at the same time. The process() call itself has imbedded in it 1 check for each time you call it.
|
|
Properly delete the perfDaemonClient after sendStats is done |
|
Initialize the reflector.
|
|
Initialize sendStats - provide the IP of the perfDaemon and an optional port number to connect to. This should be done initially before using the sendStats API.
|
|
Intercept incoming messages and call a user-defined callback function. If you want you can also alter the buffer completely so that the reflector will reflect an entirely different message. You can do this by changing the contents of the buffer or by replacing the buffer entirely by allocating memory for a new buffer and stuffing it with your own data. If you choose to allocate a totally new buffer you must remember to deallocate memory for the original buffer before substituting it with yours. If after your callback function exits you do not wish the reflector to forward the contents of the buffer, return with CAVERN_tcpReflector_c::SKIP_DISTRIBUTION. Otherwise just return CAVERN_tcpReflector_c::OK. Note also that the callback function will also be given a pointer to a CAVERNnet_tcpReflectorClient_c object that can then be used to send data directly to the client that originally sent the message. |
|
Intercept any new connections that are formed. This allows you to send private data to the newly formed connection before it assumes its data reflection duties. Callback function will be given a pointer to the CAVERNnet_tcpReflectorClient_c object that can then be used to send data directly to the client. |
|
This logs performance statistics in a file. The user opens a file and passes the file pointer with this function and results of monitoring are written into the logfile.
|
|
Call this within a while loop to let the reflector continuously do its processing.
|
|
Sends the performance statistics to a remote perfdaemon -for further analysis of the monitored data - the initSendStats API should be called first, before calling a sendStats (In order to connect to the perfdaemon initially) (Note: A typical example of sendStats is given in the (CAVERN_DISTRIB_DIR/demos/tcpreflector/ directory)
|
|
Send data to all clients connected to the reflector. |
|
Set a single ip address and port number to which all packets will be sent.
|
|
Displays the resultant statistics instantaneously in the netlogger format - this should be typically done after a read/write is done a network. Also, it should be noted that a showStats call should be made at the end of atleast one send and receive for two-way information (the same applies for logStats and sendStats)
|