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

模拟服务器

开发平台:

C/C++

  1. #ifndef ISERVER_H
  2. #define ISERVER_H
  3. #include "zport.h"
  4. #include "xbuffer.h"
  5. enum enumClientConnectInfo {
  6. enumClientConnectCreate = 0x100,
  7. enumClientConnectClose
  8. };
  9. typedef void (*CALLBACK_SERVER_EVENT)(void * lpParam, const unsigned long &ulnID, const unsigned long &ulnEventType);
  10. //进行侦听的线程
  11. class IServer;
  12. class ZListenThread : public ZThread {
  13. IServer *parent;
  14. public:
  15. ZListenThread(IServer *the_parent) : ZThread() {
  16. parent = the_parent;
  17. }
  18. int action();
  19. };
  20. class ZSendThread : public ZThread {
  21. public:
  22. IServer *parent;
  23. int index;
  24. ZSendThread()
  25. {
  26. parent = NULL;
  27. index = -1;
  28. }
  29. int action();
  30. };
  31. class ZRecvThread : public ZThread {
  32. public:
  33. IServer *parent;
  34. int index;
  35. ZRecvThread()
  36. {
  37. parent = NULL;
  38. index = -1;
  39. }
  40. int action();
  41. };
  42. class ZCloseCallBackThread : public ZThread
  43. {
  44. IServer *parent;
  45. public:
  46. ZCloseCallBackThread(IServer *the_parent) : ZThread() {
  47. parent = the_parent;
  48. }
  49. int action();
  50. };
  51. class ZCreateCallBackThread : public ZThread
  52. {
  53. IServer *parent;
  54. public:
  55. ZCreateCallBackThread(IServer *the_parent) : ZThread() {
  56. parent = the_parent;
  57. }
  58. int action();
  59. };
  60. #define MAX_IN_BUFFER 8192
  61. #define STATE_IDLE 0
  62. #define STATE_SENDING 1
  63. #define STATE_BLOCKED 2
  64. #define STATE_CLOSING 3
  65. class client_info {
  66. public:
  67. #ifdef WIN32
  68. OVERLAPPED read_overlapped;
  69. OVERLAPPED write_overlapped;
  70. WSABUF  m_wsaInBuffer; //读数据的缓冲区
  71. WSABUF m_wsaOutBuffer; //发送数据使用的缓冲区
  72. #endif
  73. SOCKET sock;
  74. struct sockaddr addr;
  75. int index;
  76. ZBuffer* buffer;
  77. //ZMutex mutex;
  78. unsigned long server_key;
  79. unsigned long client_key;
  80. short state;
  81. unsigned char conn_flag;
  82. unsigned char recv_flag;
  83. client_info() {
  84. state = STATE_IDLE;
  85. conn_flag = 0;
  86. recv_flag = 0;
  87. #ifdef WIN32
  88. ZeroMemory(&read_overlapped, sizeof(OVERLAPPED));
  89. ZeroMemory(&write_overlapped, sizeof(OVERLAPPED));
  90. #endif
  91. }
  92. ~client_info() {
  93. delete buffer;
  94. }
  95. };
  96. /*#ifndef _COND_SEND_
  97. class send_signal_info
  98. {
  99. public:
  100. unsigned short flagset;
  101. unsigned short retrycount;
  102. public:
  103. void setFlag()
  104. {
  105. flagset = true;
  106. retrycount++;
  107. }
  108. void clearFlag()
  109. {
  110. flagset = false;
  111. retrycount = 0;
  112. }
  113. send_signal_info()
  114. {
  115. flagset = false;
  116. retrycount = 0;
  117. }
  118. };
  119. #endif
  120. */
  121. class IServer {
  122. public:
  123. CALLBACK_SERVER_EVENT call_back;
  124. void *parameter;
  125. ZPerf sendPerf;
  126. ZPerf recvPerf;
  127. #ifdef WIN32
  128. HANDLE CompletionPort;
  129. #else
  130. ZMutex mutex;
  131. // #ifndef _EPOLL_
  132. //sigset_t *sigsets;
  133. // #ifndef _COND_SEND_
  134. // send_signal_info *sigflags;
  135. // #else
  136. //pthread_cond_t cond_send_data;
  137. //ZMutex mutex_send_data;
  138. //pthread_t *thr_id;
  139. // #endif
  140. //int *pids;
  141. int pid;
  142. //int current_thread;
  143. // #else
  144. // Epoll* pEpoll;
  145. // #endif
  146. ZSendThread *send_threads;
  147. ZRecvThread *recv_threads;
  148. ZCloseCallBackThread* close_callback_thread;
  149. ZCreateCallBackThread* create_callback_thread;
  150. #endif
  151. int max_thread; //最大并发线程数目
  152. SOCKET listen_socket;
  153. ZListenThread *listen_thread;
  154. client_info *clients;
  155. int max_client;
  156. IServer(int number, int thread_number = 4, int max_send = 300 * 1024, int max_receive = 32 * 1024);
  157. ~IServer();
  158. int getConnection(SOCKET sock);
  159. void closeConnection(client_info *client);
  160. bool sendData(client_info *client);
  161. bool receiveData(client_info *client);
  162. //对外公开的接口
  163. int Startup();
  164. int Cleanup();
  165. int Release();
  166. int Open(const unsigned long &ulnAddressToListenOn, const unsigned short &usnPortToListenOn);
  167. int OpenService(const unsigned long &ulnAddressToListenOn, const unsigned short &usnPortToListenOn) {
  168. return Open(ulnAddressToListenOn, usnPortToListenOn);
  169. }
  170. int CloseService();
  171. int RegisterMsgFilter(void * lpParam, CALLBACK_SERVER_EVENT pfnEventNotify);
  172. int PreparePackSink();
  173. int PackDataToClient(const unsigned long &ulnClientID, const void *pData, unsigned long datalength);
  174. int SendPackToClient();
  175. int SendPackToClient(int index);
  176. int SendData(const unsigned long &ulnClientID, const void *pData, unsigned long datalength);
  177. const void *GetPackFromClient(unsigned long ulnClientID, unsigned int &datalength);
  178. int ShutdownClient(const unsigned long &ulnClientID);
  179. const char * GetClientInfo(const unsigned long &ulnClientID);
  180. };
  181. #endif