1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
//------------------------------------------------------------------------------
// Copyright (c) 2011-2012 by European Organization for Nuclear Research (CERN)
// Author: Lukasz Janyst <ljanyst@cern.ch>
//------------------------------------------------------------------------------
// XRootD is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// XRootD is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with XRootD. If not, see <http://www.gnu.org/licenses/>.
//------------------------------------------------------------------------------
#ifndef SERVER_HH
#define SERVER_HH
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <cstdint>
#include <pthread.h>
namespace XrdClTests {
//------------------------------------------------------------------------------
//! Interface for the client handler
//------------------------------------------------------------------------------
class ClientHandler
{
public:
//--------------------------------------------------------------------------
//! Constructor
//--------------------------------------------------------------------------
ClientHandler();
//--------------------------------------------------------------------------
//! Destructor
//--------------------------------------------------------------------------
virtual ~ClientHandler();
//--------------------------------------------------------------------------
//! Handle connection
//!
//! @param socket the connection socket - needs to be closed when not needed
//--------------------------------------------------------------------------
virtual void HandleConnection( int socket ) = 0;
//--------------------------------------------------------------------------
//! Update statistics of the received data
//--------------------------------------------------------------------------
void UpdateSentData( char *buffer, uint32_t size );
//--------------------------------------------------------------------------
//! Update statistics of the sent data
//--------------------------------------------------------------------------
void UpdateReceivedData( char *buffer, uint32_t size );
//--------------------------------------------------------------------------
//! Get sent bytes count
//--------------------------------------------------------------------------
uint64_t GetSentBytes() const
{
return pSentBytes;
}
//--------------------------------------------------------------------------
//! Get the checksum of the sent data buffers
//--------------------------------------------------------------------------
uint32_t GetSentChecksum() const
{
return pSentChecksum;
}
//--------------------------------------------------------------------------
//! Get the received bytes count
//--------------------------------------------------------------------------
uint64_t GetReceivedBytes() const
{
return pReceivedBytes;
}
//--------------------------------------------------------------------------
//! Get the checksum of the received data buffers
//--------------------------------------------------------------------------
uint32_t GetReceivedChecksum() const
{
return pReceivedChecksum;
}
private:
uint64_t pSentBytes;
uint64_t pReceivedBytes;
uint32_t pSentChecksum;
uint32_t pReceivedChecksum;
};
//------------------------------------------------------------------------------
//! Client hander factory interface
//------------------------------------------------------------------------------
class ClientHandlerFactory
{
public:
//--------------------------------------------------------------------------
//! Destructor
//--------------------------------------------------------------------------
virtual ~ClientHandlerFactory() {};
//--------------------------------------------------------------------------
//! Create a client handler
//--------------------------------------------------------------------------
virtual ClientHandler *CreateHandler() = 0;
};
//------------------------------------------------------------------------------
// Forward declaration
//------------------------------------------------------------------------------
struct ClientHelper;
//------------------------------------------------------------------------------
//! Server emulator
//------------------------------------------------------------------------------
class Server
{
public:
enum ProtocolFamily
{
Inet4,
Inet6,
Both
};
typedef std::map<std::string, std::pair<uint64_t, uint32_t> > TransferMap;
//--------------------------------------------------------------------------
//! Constructor
//--------------------------------------------------------------------------
Server( ProtocolFamily family );
//--------------------------------------------------------------------------
//! Destructor
//--------------------------------------------------------------------------
~Server();
//--------------------------------------------------------------------------
//! Listen for incoming connections and handle clients
//!
//! @param port port to listen on
//! @param accept number of clients to accept
//! @param factory client handler factory, the server takes ownership
//! of this object
//--------------------------------------------------------------------------
bool Setup( int port, int accept, ClientHandlerFactory *factory );
//--------------------------------------------------------------------------
//! Start the server
//--------------------------------------------------------------------------
bool Start();
//--------------------------------------------------------------------------
//! Wait for the server to finish - it blocks until all the clients
//! have been handled
//--------------------------------------------------------------------------
bool Stop();
//--------------------------------------------------------------------------
//! Get the statisctics of the sent data
//--------------------------------------------------------------------------
std::pair<uint64_t, uint32_t> GetSentStats( const std::string host ) const;
//--------------------------------------------------------------------------
//! Get the stats of the received data
//--------------------------------------------------------------------------
std::pair<uint64_t, uint32_t> GetReceivedStats( const std::string host ) const;
//--------------------------------------------------------------------------
//! Handle clients
//--------------------------------------------------------------------------
int HandleConnections();
//--------------------------------------------------------------------------
//! Get port where server is running
//--------------------------------------------------------------------------
int GetPort() const;
private:
TransferMap pSent;
TransferMap pReceived;
pthread_t pServerThread;
std::vector<ClientHelper*> pClients;
int pListenSocket;
ClientHandlerFactory *pHandlerFactory;
ProtocolFamily pProtocolFamily;
int pPort;
};
}
#endif // SERVER_HH
|