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

模拟服务器

开发平台:

C/C++

  1. #ifndef ZPORT_H
  2. #define ZPORT_H
  3. //Windows相关的代码----------------------------------------------------------------------------------
  4. #ifdef WIN32
  5. #include <windows.h>
  6. #else
  7. #include <pthread.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <arpa/inet.h>
  11. #include <unistd.h>
  12. #include <signal.h>
  13. #include <fcntl.h>
  14. #endif
  15. #include <stdio.h>
  16. #include <string.h>
  17. #ifndef WIN32
  18. #define WINAPI
  19. #define BYTE unsigned char
  20. #define DWORD  unsigned long
  21. #define LPVOID void *
  22. #ifdef _DEBUG
  23. //{
  24. void _trace(char *fmt, ...);
  25. #ifndef ASSERT
  26. #define ASSERT(x) { if ( !( x ) ) _asm{ int 0x03 } }
  27. #endif
  28. #ifndef VERIFY
  29. #define VERIFY(x) { if ( !( x ) ) _asm{ int 0x03 } }
  30. #endif
  31. //}
  32. #else
  33. //{
  34. #ifndef ASSERT
  35. #define ASSERT(x)
  36. #endif
  37. #ifndef VERIFY
  38. #define VERIFY(x) x
  39. #endif
  40. //}
  41. #endif
  42. #ifdef _DEBUG
  43. //{
  44. #ifndef TRACE
  45. #define TRACE _trace
  46. #endif
  47. //}
  48. #else
  49. //{
  50. inline void _trace(const char* fmt, ...) { }
  51. #ifndef TRACE
  52. #define TRACE  1 ? (void)0 : _trace
  53. #endif
  54. //}
  55. #endif
  56. #define INIT_PTR(x) do{ (x) = NULL; }while(0);
  57. #define SAFE_DELETE(x) try{ if( (x) != NULL ) { delete (x); (x) = NULL; } } catch(...) { TRACE("SAFE_DELETE errorn"); }
  58. #define SAFE_DELETE_ARRAY(x) try{ if( (x) != NULL ) { delete[] (x); (x) = NULL; } } catch(...) { TRACE("SAFE_DELETE_ARRAY errorn"); }
  59. #ifndef SAFE_FREE
  60. #undef SAFE_FREE
  61. #define SAFE_FREE(x) try{ if( (x) != NULL ) { free(x); (x)=NULL; } } catch(...) { TRACE("SAFE_FREE errorn"); }
  62. #endif
  63. #ifndef SAFE_RELEASE
  64. #undef SAFE_RELEASE
  65. #define SAFE_RELEASE(x) try{ if( (x) != NULL ) { (x)->Release(); (x) = NULL; } } catch(...) { TRACE("SAFE_RELEASE errorn"); }
  66. #endif
  67. #define SAFE_CLOSEHANDLE(x) try{ if (x) { CloseHandle(x); (x) = NULL; } } catch(...) { TRACE("SAFE_CLOSEHANDLE errorn"); }
  68. #define SAFE_FREELIB(x) try{ if (x) { FreeLibrary(x); (x) = NULL; } } catch(...) { TRACE("SAFE_FREELIB errorn"); }
  69. /*
  70.  * Quick and safely convert number format
  71.  */
  72. #ifndef MAKEFOURCC
  73. //{
  74. #define MAKEFOURCC(ch0, ch1, ch2, ch3)
  75. ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |
  76. ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
  77. //}
  78. #endif
  79. #define COUNT_OF_ARRAY(array) ( sizeof( array ) / sizeof( array[0] ) )
  80. /*
  81.  * 'c' must be a char and not be a expression in the _private macro 
  82.  */
  83. #define _private_IS_NUM(c)     ((c) >= '0' && (c) <= '9')
  84. #define _private_IS_SPACE(c)   ((c) == ' ' || (c) == 'r' || (c) == 'n' || (c) == 't' || (c) == 'x')
  85. #define IS_NUM(c) _private_IS_NUM(c)
  86. #define IS_SPACE(c) _private_IS_SPACE(c)
  87. inline void strlwr(char* sz)
  88. {
  89. char c;
  90. for (int i = 0; 0 != (c = sz[i]); i++)
  91. {
  92. if (c >= 'A' && c <= 'Z')
  93. sz[i] = c + ('a' - 'A');
  94. }
  95. }
  96. #define SOCKET int
  97. #define closesocket close
  98. #define INVALID_SOCKET -1
  99. #endif
  100. //封装的互斥量类
  101. class ZMutex {
  102. #ifdef WIN32
  103.   CRITICAL_SECTION mutex;
  104. #else
  105. public:
  106.   pthread_mutex_t mutex;
  107.   //static int all_count;
  108.   int count;
  109. #endif
  110. public:
  111.   ZMutex() {
  112. #ifdef WIN32
  113.     InitializeCriticalSection(&mutex);
  114. #else
  115. pthread_mutexattr_t attr;
  116. pthread_mutexattr_init(&attr);
  117. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  118.     int rc = pthread_mutex_init(&mutex, &attr);
  119. //printf("ZMutex Created..n");
  120. count = 0;
  121. #endif                
  122.   }
  123.   ~ZMutex() {
  124. #ifdef WIN32
  125.     DeleteCriticalSection(&mutex);
  126. #else
  127.     int rc = pthread_mutex_destroy(&mutex);
  128. //printf("ZMutex released..n");
  129. #endif                
  130.   }
  131.   bool trylock()
  132.   {
  133. #ifdef WIN32
  134.   return false;
  135. #else
  136. int rc = pthread_mutex_trylock(&mutex);
  137. /* if (rc != 0)
  138. {
  139. printf("trylock mutex error %dn", rc);
  140. }*/
  141. return (0 == rc);
  142. #endif
  143.   }
  144.   void lock() {
  145. #ifdef WIN32        
  146.     EnterCriticalSection(&mutex);
  147. #else
  148.     int rc = pthread_mutex_lock(&mutex);
  149. if (rc != 0)
  150. {
  151. printf("lock mutex error %dn", rc);
  152. }
  153. //all_count++;
  154. count++;
  155. #endif                
  156.   }
  157.   void unlock() {
  158. #ifdef WIN32        
  159.     LeaveCriticalSection(&mutex);
  160. #else
  161. //all_count--;
  162. count--;
  163.     int rc = pthread_mutex_unlock(&mutex);
  164. if (rc != 0)
  165. {
  166. printf("unlock mutex error %dn", rc);
  167. }
  168. #endif                
  169.   }
  170. };
  171. //封装的定时器类(精确到毫秒)
  172. class ZTimer {
  173. public:
  174.   static inline unsigned long now() { //返回当前的毫秒数
  175. #ifdef WIN32        
  176.     return GetTickCount();
  177. #else
  178.     return 0;
  179. #endif
  180.   }
  181. };
  182. //封装的线程类,继承这个类可以实现
  183. class ZThread {
  184. #ifdef WIN32
  185.   unsigned long id;
  186.   HANDLE handle;
  187. #else
  188.   pthread_t p_thread;
  189. #endif
  190. public:
  191. bool bStop;
  192. ZThread() {
  193. #ifdef WIN32
  194. id = -1;
  195. #endif
  196. bStop = false;
  197. }
  198. void start();
  199. void stop();
  200. virtual int action() = 0;
  201. };
  202. #include <map>
  203. #include <list>
  204. namespace OnlineGameLib {
  205. /*
  206.  * CNodeList
  207.  */
  208. class CNodeList
  209. {
  210. public:
  211. class Node
  212.     {
  213. public:
  214. Node *Next() const { return m_pNext; };
  215. void Next( Node *pNext );
  216. void AddToList( CNodeList *pList );
  217. void RemoveFromList();
  218. protected:
  219. Node();
  220. ~Node();
  221. private:
  222. friend class CNodeList;
  223. void Unlink();
  224. Node *m_pNext;
  225. Node *m_pPrev;
  226. CNodeList *m_pList;
  227. };
  228. CNodeList();
  229. void PushNode( Node *pNode );
  230. Node *PopNode();
  231. Node *Head() const { return m_pHead; };
  232. size_t Count() const { return m_numNodes; };
  233. bool Empty() const { return ( 0 == m_numNodes ); };
  234. private:
  235. friend void Node::RemoveFromList();
  236. void RemoveNode( Node *pNode );
  237. Node *m_pHead; 
  238. size_t m_numNodes;
  239. };
  240. inline void CNodeList::Node::Next( Node *pNext )
  241. {
  242. m_pNext = pNext;
  243. if ( pNext )
  244. {
  245. pNext->m_pPrev = this;
  246. }
  247. }
  248. /*
  249.  * TNodeList
  250.  */
  251. template <class T> class TNodeList : public CNodeList
  252. {
  253. public:
  254.          
  255. T *PopNode();
  256.    
  257. T *Head() const;
  258. static T *Next( const T *pNode );
  259. };
  260. template <class T>
  261. T *TNodeList<T>::PopNode()
  262. {
  263. return static_cast< T* >( CNodeList::PopNode() );
  264. }
  265. template <class T>
  266. T *TNodeList<T>::Head() const
  267. {
  268. return static_cast< T* >( CNodeList::Head() );
  269. }
  270. template <class T>
  271. T *TNodeList<T>::Next( const T *pNode )
  272. {
  273. return static_cast< T* >( pNode->Next() );
  274. }
  275. } // End of namespace OnlineGameLib
  276. namespace OnlineGameLib {
  277. namespace Win32 {
  278. /*
  279.  * CBuffer class
  280.  */
  281. class CBuffer : public CNodeList::Node
  282. {
  283. public:
  284. class Allocator;
  285. friend class Allocator;
  286. size_t GetUsed() const { return m_used; };
  287. size_t GetSize() const { return m_size; };
  288. const BYTE *GetBuffer() const { return m_buffer_ptr; };
  289. CBuffer *GetHeadPack( size_t packLength );
  290. CBuffer *GetNextPack();
  291. bool  HaveNextPack() { return ( m_offsetNextPack < m_used ) ? true : false; };
  292. void AddData( const char * const pData, size_t dataLength );
  293. void AddData( const BYTE * const pData, size_t dataLength );
  294. void AddData( BYTE data );
  295. void Use( size_t dataUsed ) { m_used += dataUsed; };
  296. CBuffer *SplitBuffer( size_t bytesToRemove );
  297. CBuffer *AllocateNewBuffer() const;
  298. void ConsumeAndRemove( size_t bytesToRemove );
  299. void Empty() { m_used = 0; };
  300. void AddRef() { m_ref++; };
  301. void Release();
  302. private:
  303. Allocator &m_allocator;
  304. long m_ref;
  305. const size_t m_size;
  306. size_t m_used;
  307. size_t m_packLength;
  308. size_t m_offsetNextPack;
  309. /*
  310.  * start of the actual buffer, must remain the last
  311.  * data member in the class.
  312.  */
  313. BYTE *m_buffer_ptr; // four bytes aligned
  314. //BYTE m_buffer_base_addr[0];
  315. private:
  316. static void *operator new( size_t objSize, size_t bufferSize );
  317. static void operator delete( void *pObj, size_t bufferSize );
  318.       
  319. CBuffer( Allocator &allocator, size_t size );
  320. ~CBuffer();
  321. /*
  322.  * No copies do not implement
  323.  */
  324. CBuffer( const CBuffer &rhs );
  325. CBuffer &operator=( const CBuffer &rhs );
  326. };
  327. inline void CBuffer::ConsumeAndRemove( size_t bytesToRemove )
  328. {
  329. m_used -= bytesToRemove;
  330. memmove( m_buffer_ptr, m_buffer_ptr + bytesToRemove, m_used );
  331. }
  332. /*
  333.  * CBuffer::Allocator class
  334.  */
  335. class CBuffer::Allocator
  336. {
  337. public:
  338. friend class CBuffer;
  339. explicit Allocator( size_t bufferSize, size_t maxFreeBuffers );
  340. virtual ~Allocator();
  341. CBuffer *Allocate();
  342. size_t GetBufferSize() const { return m_bufferSize; };
  343. bool ReSet( size_t bufferSize, size_t maxFreeBuffers )
  344. {
  345. memcpy((void*)&m_bufferSize, &bufferSize, sizeof( size_t ) );
  346. memcpy((void*)&m_maxFreeBuffers, &maxFreeBuffers, sizeof( size_t ) );
  347. return true;
  348. }
  349. protected:
  350. void Flush();
  351. private:
  352. void Release( CBuffer *pBuffer );
  353. virtual void OnBufferCreated() {}
  354. virtual void OnBufferAllocated() {}
  355. virtual void OnBufferReleased() {}
  356. void DestroyBuffer( CBuffer *pBuffer )
  357. {
  358. SAFE_DELETE( pBuffer );
  359. }
  360. const size_t m_bufferSize;
  361. typedef TNodeList< CBuffer > BufferList;
  362. BufferList m_freeList;
  363. BufferList m_activeList;
  364. const size_t m_maxFreeBuffers;
  365.     /*
  366.  * No copies do not implement
  367.  */
  368. Allocator( const Allocator &rhs );
  369. Allocator &operator=( const Allocator &rhs );
  370. };
  371. } // End of namespace OnlineGameLib
  372. } // End of namespace Win32
  373. #endif