00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef SIMPLESERVER_H
00034 #define SIMPLESERVER_H
00035
00036 #ifdef _WIN32
00037 # include <time.h>
00038 #else
00039 # include <sys/time.h>
00040 # include <unistd.h>
00041 #endif
00042
00043 #include "packetbuffer.h"
00044 #include "flags.h"
00045 #include "linkedlist.h"
00046 #include "bufferedsocket.h"
00047 #include "threadutils.h"
00048 #include "packetmessageque.h"
00049 #include "serversocket.h"
00050 #include "simplemanager.h"
00051
00052 namespace ssobjects
00053 {
00054
00055 #define throwSimpleServerException(m) (throw SimpleServerException(m,__FILE__,__LINE__))
00056
00060 class SimpleServerException : public GeneralException
00061 {
00062 public:
00063 SimpleServerException(char* pchMessage,const char* pFname,const int iLine)
00064 : GeneralException(pchMessage,pFname,iLine){};
00065 };
00066
00067 class ServerSocket;
00068 class ServerHandler;
00069 class SimpleManager;
00070
00150 class SimpleServer : public ThreadHandler
00151 {
00152 friend SimpleManager;
00153
00154 public:
00155 enum
00156 {
00157 MIN_FREQ=10
00158 };
00159
00160 public:
00161 SimpleServer(const SockAddr& saBind,
00162 const unsigned32 nFreq=1000,
00163 const unsigned32 nMaxConnections=100);
00164 SimpleServer(ServerSocket* const psocket,
00165 const unsigned32 nFreq);
00166 virtual ~SimpleServer();
00167
00168 protected:
00220 virtual void processSingleMsg(PacketMessage* pmsg) = 0;
00221
00223 virtual void idle(unsigned32 nTimer=0) {UNUSED_ALWAYS(nTimer);}
00224
00225
00226 public:
00227 virtual void startServer();
00228 virtual void killServer();
00229 virtual void pauseIncomingConnections();
00230 virtual void sendPacket(ServerSocket* psocket,const PacketBuffer& packet);
00231 virtual void sendPacket(ServerSocket* psocket,const PacketBuffer* ppacket);
00232 virtual void send2All(const PacketBuffer& packet);
00233 virtual void send2All(const PacketBuffer* ppacket);
00234 virtual void removeSocket(ServerSocket* psocket);
00235
00236 public:
00237 static bool canBind(SockAddr& saBind);
00238 unsigned32 getTicks();
00239 bool isThreaded() { return m_bUsingThread; }
00240
00241
00242 protected:
00243 threadReturn ThreadHandlerProc(void);
00244 void processMessages();
00245 bool processSockets(int iReady);
00246 void processSelectError();
00247 void acceptConnection();
00248 int getMaxFD();
00249 long getSleepTime();
00250 void addMsg(PacketMessage* pmsg) { m_que.add(pmsg); }
00251 void queClosedMessage(ServerSocket* psocketRemoving);
00252
00253 private:
00254 SimpleServer(const SimpleServer& server);
00255 SimpleServer& operator=(const SimpleServer& server);
00256
00257 protected:
00258 SocketInstance m_sListen;
00259 SockAddr m_saServer;
00260 LinkedList<ServerSocket> m_listClients;
00261 PacketMessageQue m_que;
00262 unsigned32 m_nIdleFrequency;
00263 unsigned32 m_nMaxCon;
00264 bool m_bUsingThread;
00265 bool m_bPause;
00266 unsigned32 m_nSleepTime;
00267 struct timeval m_tvServerStarted;
00268 fd_set m_rset,m_wset;
00269 };
00270
00271 };
00272
00273 #endif //SIMPLESERVER_H