SocketServer.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef SOCKET_SERVER_HPP
  14. #define SOCKET_SERVER_HPP
  15. #include <NdbTCP.h>
  16. #include <NdbMutex.h>
  17. #include <NdbThread.h>
  18. #include <Vector.hpp>
  19. extern "C" void* sessionThread_C(void*);
  20. extern "C" void* socketServerThread_C(void*);
  21. /**
  22.  *  Socket Server
  23.  */
  24. class SocketServer {
  25. public:
  26.   /**
  27.    * A Session 
  28.    */
  29.   class Session {
  30.   public:
  31.     virtual ~Session() {}
  32.     virtual void runSession(){}
  33.     virtual void stopSession(){ m_stop = true; }
  34.   protected:
  35.     friend class SocketServer;
  36.     friend void* sessionThread_C(void*);
  37.     Session(NDB_SOCKET_TYPE sock): m_socket(sock)
  38.       {
  39. DBUG_ENTER("SocketServer::Session");
  40. DBUG_PRINT("enter",("NDB_SOCKET: %d", m_socket));
  41. m_stop = m_stopped = false;
  42. DBUG_VOID_RETURN;
  43.       }
  44.     
  45.     bool m_stop;    // Has the session been ordered to stop?
  46.     bool m_stopped; // Has the session stopped?
  47.     
  48.     NDB_SOCKET_TYPE m_socket;
  49.   };
  50.   
  51.   /**
  52.    * A service i.e. a session factory
  53.    */
  54.   class Service {
  55.   public:
  56.     virtual ~Service(){}
  57.     
  58.     /**
  59.      * Returned Session will be ran in own thread
  60.      *
  61.      * To manage threads self, just return NULL
  62.      */
  63.     virtual Session * newSession(NDB_SOCKET_TYPE theSock) = 0;
  64.     virtual void stopSessions(){}
  65.   };
  66.   
  67.   /**
  68.    * Constructor / Destructor
  69.    */
  70.   SocketServer(int maxSessions = 32);
  71.   ~SocketServer();
  72.   
  73.   /**
  74.    * Setup socket and bind it
  75.    *  then  close the socket
  76.    * Returns true if succeding in binding
  77.    */
  78.   static bool tryBind(unsigned short port, const char * intface = 0);
  79.   /**
  80.    * Setup socket
  81.    *   bind & listen
  82.    * Returns false if no success
  83.    */
  84.   bool setup(Service *, unsigned short port, const char * pinterface = 0);
  85.   
  86.   /**
  87.    * start/stop the server
  88.    */
  89.   void startServer();
  90.   void stopServer();
  91.   
  92.   /**
  93.    * stop sessions
  94.    *
  95.    * Note: Implies stopServer
  96.    */
  97.   void stopSessions(bool wait = false);
  98.   
  99.   void foreachSession(void (*f)(Session*, void*), void *data);
  100. private:
  101.   struct SessionInstance {
  102.     Service * m_service;
  103.     Session * m_session;
  104.     NdbThread * m_thread;
  105.   };
  106.   struct ServiceInstance {
  107.     Service * m_service;
  108.     NDB_SOCKET_TYPE m_socket;
  109.   };
  110.   MutexVector<SessionInstance> m_sessions;
  111.   MutexVector<ServiceInstance> m_services;
  112.   unsigned m_maxSessions;
  113.   
  114.   void doAccept();
  115.   void checkSessions();
  116.   void startSession(SessionInstance &);
  117.   
  118.   /**
  119.    * Note, this thread is only used when running interactive
  120.    * 
  121.    */
  122.   bool m_stopThread;
  123.   struct NdbThread * m_thread;
  124.   NdbLockable m_threadLock;
  125.   void doRun();
  126.   friend void* socketServerThread_C(void*);
  127.   friend void* sessionThread_C(void*);
  128. };
  129. #endif