SocketServer.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:6k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/02/14
  3. file base: SocketServer
  4. file ext: h
  5. author: liupeng
  6. purpose: Build
  7. *********************************************************************/
  8. #ifndef __INCLUDE_SOCKETSERVER_H__
  9. #define __INCLUDE_SOCKETSERVER_H__
  10. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  11. #pragma once
  12. #endif
  13. #include "UsesWinsock.h"
  14. #include "Thread.h"
  15. #include "CriticalSection.h"
  16. #include "IOCompletionPort.h"
  17. #include "IOBuffer.h"
  18. #include "ManualResetEvent.h"
  19. #include "NodeList.h"
  20. #include "OpaqueUserData.h"
  21. /*
  22.  * namespace OnlineGameLib::Win32
  23.  */
  24. namespace OnlineGameLib {
  25. namespace Win32 {
  26. /*
  27.  * CSocketServer
  28.  */
  29. class CSocketServer : protected CThread, private CUsesWinsock, private CIOBuffer::Allocator
  30. {
  31. public:
  32. class Socket;
  33. class WorkerThread;
  34. friend class Socket;
  35. virtual ~CSocketServer();
  36. void Open( 
  37. unsigned long addressToListenOn,
  38. unsigned short portToListenOn
  39. );
  40. using CThread::Start;
  41. void StartAcceptingConnections();
  42. void StopAcceptingConnections();
  43. void InitiateShutdown();
  44. void WaitForShutdownToComplete();
  45. protected:
  46. CSocketServer(
  47. unsigned long addressToListenOn,
  48. unsigned short portToListenOn,
  49. size_t maxFreeSockets,
  50. size_t maxFreeBuffers,
  51. size_t bufferSize = 1024,
  52. size_t numThreads = 0);
  53. CSocketServer(
  54. size_t maxFreeSockets,
  55. size_t maxFreeBuffers,
  56. size_t bufferSize = 1024,
  57. size_t numThreads = 0);
  58. void ReleaseSockets();
  59. void ReleaseBuffers();
  60. /*
  61.  * Virtual function has different access specifier to base class
  62.  */
  63. virtual int Run();
  64. private:
  65. /*
  66.  * Override this to create your worker thread
  67.  */
  68. virtual WorkerThread *CreateWorkerThread( CIOCompletionPort &iocp ) = 0;
  69. /*
  70.  * Override this to create the listening socket of your choice
  71.  */
  72. virtual SOCKET CreateListeningSocket( 
  73. unsigned long address,
  74. unsigned short port) = 0;
  75. /*
  76.  * Interface for derived classes to receive state change notifications...
  77.  */
  78. virtual void OnStartAcceptingConnections() {}
  79. virtual void OnStopAcceptingConnections() {}
  80. virtual void OnShutdownInitiated() {}
  81. virtual void OnShutdownComplete() {}
  82. virtual void OnConnectionCreated() {}
  83. virtual void OnConnectionEstablished(
  84. Socket *pSocket,
  85. CIOBuffer *pAddress) = 0;
  86. virtual void OnConnectionClosed( Socket * /*pSocket*/ ) {}
  87. virtual void OnConnectionDestroyed() {}
  88. virtual void OnError( const _tstring &message );
  89. virtual void OnBufferCreated() {}
  90. virtual void OnBufferAllocated() {}
  91. virtual void OnBufferReleased() {}
  92. virtual void OnBufferDestroyed() {}
  93. Socket *AllocateSocket( SOCKET theSocket );
  94. void ReleaseSocket( Socket *pSocket );
  95. void DestroySocket( Socket *pSocket );
  96. void PostAbortiveClose( Socket *pSocket );
  97. void Read( Socket *pSocket, CIOBuffer *pBuffer );
  98. void Write( Socket *pSocket, const char *pData, size_t dataLength, bool thenShutdown );
  99. void Write( Socket *pSocket, CIOBuffer *pBuffer, bool thenShutdown );
  100. virtual void PreWrite( 
  101. Socket *pSocket, 
  102. CIOBuffer *pBuffer, 
  103. const char *pData, 
  104. size_t dataLength ) {};
  105. const size_t m_numThreads;
  106. CCriticalSection m_listManipulationSection;
  107. typedef OnlineGameLib::TNodeList<Socket> SocketList;
  108. SocketList m_activeList;
  109. SocketList m_freeList;
  110. SOCKET m_listeningSocket;
  111. CIOCompletionPort m_iocp;
  112. CManualResetEvent m_shutdownEvent;
  113. CManualResetEvent m_acceptConnectionsEvent;
  114. unsigned long m_address;
  115. unsigned short m_port;
  116. const size_t m_maxFreeSockets;
  117. /*
  118.  * No copies do not implement
  119.  */
  120. CSocketServer( const CSocketServer &rhs );
  121. CSocketServer &operator=( const CSocketServer &rhs );
  122. };
  123. /*
  124.  * CSocketServer::Socket
  125.  */
  126. class CSocketServer::Socket : public CNodeList::Node, public COpaqueUserData
  127. {
  128. public :
  129. friend class CSocketServer;
  130. friend class CSocketServer::WorkerThread;
  131. void Read( CIOBuffer *pBuffer = 0 );
  132. void Write( const char *pData, size_t dataLength, bool thenShutdown = false );
  133. void Write( CIOBuffer *pBuffer, bool thenShutdown = false );
  134. void AddRef();
  135. void Release();
  136. void Shutdown( int how = SD_BOTH );
  137. void Close();
  138. void AbortiveClose();
  139. private:
  140. Socket( CSocketServer &server, SOCKET socket );
  141. ~Socket();
  142. void Attach( SOCKET socket );
  143. CSocketServer &m_server;
  144. SOCKET m_socket;
  145. long m_ref;
  146. /*
  147.  * No copies do not implement
  148.  */
  149. Socket( const Socket &rhs );
  150. Socket &operator=( const Socket &rhs );
  151. };
  152. /*
  153.  * CSocketServer::WorkerThread
  154.  */
  155. class CSocketServer::WorkerThread : public CThread
  156. {
  157. public:
  158. virtual ~WorkerThread() {}
  159. void InitiateShutdown();
  160. void WaitForShutdownToComplete();
  161. protected:
  162. explicit WorkerThread( CIOCompletionPort &iocp );
  163. /*
  164.  * Virtual function has different access specifier to base class
  165.  */
  166. virtual int Run();
  167. private:
  168. virtual void OnBeginProcessing() {}
  169. virtual void OnEndProcessing() {}
  170. virtual void OnError( const _tstring &message );
  171. void Read( Socket *pSocket, CIOBuffer *pBuffer ) const;
  172. virtual void ReadCompleted( Socket *pSocket, CIOBuffer *pBuffer ) = 0;
  173. void Write( Socket *pSocket, CIOBuffer *pBuffer ) const;
  174. virtual void WriteCompleted( Socket *pSocket, CIOBuffer *pBuffer );
  175. void AbortiveClose( Socket *pSocket );
  176. CIOCompletionPort &m_iocp;
  177. /*
  178.  * No copies do not implement
  179.  */
  180. WorkerThread( const WorkerThread &rhs );
  181. WorkerThread &operator=( const WorkerThread &rhs );
  182. };
  183. } // End of namespace OnlineGameLib
  184. } // End of namespace Win32
  185. #endif // __INCLUDE_SOCKETSERVER_H__