诸暨麻将添加redis
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

560 рядки
15 KiB

  1. #ifndef SOCKET_ENGINE_HEAD_FILE
  2. #define SOCKET_ENGINE_HEAD_FILE
  3. //组件头文件
  4. #include "KernelEngineHead.h"
  5. #include "QueueService.h"
  6. #include "QueueServiceEvent.h"
  7. #include "MyEncrypt.h"
  8. #include "zlreactor/ByteBuffer.h"
  9. #include "zlreactor/net/http/HttpContext.h"
  10. #include "zlreactor/WebSocket.h"
  11. //#include <conio.h>
  12. //
  13. //#define BG_MOBILE (BYTE)(0x01) //手机群发
  14. //#define BG_COMPUTER (BYTE)(0x02) //电脑群发
  15. //#define BG_ALL_CLIENT (BYTE)(0xFF) //全体群发
  16. //关闭原因
  17. #define SHUT_REASON_INSIDE 0 //内部原因
  18. #define SHUT_REASON_NORMAL 1 //正常关闭
  19. #define SHUT_REASON_REMOTE 2 //远程关闭
  20. #define SHUT_REASON_TIME_OUT 3 //网络超时
  21. #define SHUT_REASON_EXCEPTION 4 //异常关闭
  22. //////////////////////////////////////////////////////////////////////////
  23. //公共定义
  24. //网络状态
  25. #define SOCKET_STATUS_IDLE 0 //空闲状态
  26. #define SOCKET_STATUS_WAIT 1 //等待状态
  27. #define SOCKET_STATUS_CONNECT 2 //连接状态
  28. //连接错误
  29. #define CONNECT_SUCCESS 0 //连接成功
  30. #define CONNECT_FAILURE 1 //连接失败
  31. #define CONNECT_EXCEPTION 2 //参数异常
  32. #define CONNECT_PROXY_FAILURE 3 //连接成功
  33. #define CONNECT_PROXY_USER_INVALID 4 //用户无效
  34. //////////////////////////////////////////////////////////////////////////
  35. //枚举定义
  36. //控制类型
  37. enum enOperationType
  38. {
  39. OperationType_Send, //发送类型
  40. OperationType_Recv, //接收类型
  41. };
  42. //////////////////////////////////////////////////////////////////////////
  43. //类说明
  44. class COverLapped;
  45. class CServerSocketRSThread;
  46. class COverLappedSend;
  47. class CTCPNetworkEngine;
  48. class CServerSocketItem;
  49. class CSocketAcceptThread;
  50. template <enOperationType OperationType> class CATLOverLapped;
  51. typedef class CATLOverLapped<OperationType_Recv> COverLappedRecv;
  52. typedef CWHArray<COverLappedSend *> COverLappedSendPtr;
  53. typedef CWHArray<COverLappedRecv *> COverLappedRecvPtr;
  54. //////////////////////////////////////////////////////////////////////////
  55. //接口定义
  56. //连接对象回调接口
  57. interface IServerSocketItemSink
  58. {
  59. //应答消息
  60. virtual bool OnSocketAcceptEvent(CServerSocketItem * pServerSocketItem) = NULL;
  61. //读取消息
  62. virtual bool OnSocketReadEvent(TCP_Command Command, void * pBuffer, WORD wDataSize, CServerSocketItem * pServerSocketItem) = NULL;
  63. //关闭消息
  64. virtual bool OnSocketCloseEvent(CServerSocketItem * pServerSocketItem) = NULL;
  65. //进后台消息
  66. virtual bool OnSocketForegroundEvent(CServerSocketItem* pServerSocketItem) = NULL;
  67. };
  68. //////////////////////////////////////////////////////////////////////////
  69. //重叠结构类
  70. class COverLapped
  71. {
  72. //变量定义
  73. public:
  74. WSABUF m_WSABuffer; //数据指针
  75. OVERLAPPED m_OverLapped; //重叠结构
  76. const enOperationType m_OperationType; //操作类型
  77. //函数定义
  78. public:
  79. //构造函数
  80. COverLapped(enOperationType OperationType);
  81. //析构函数
  82. virtual ~COverLapped();
  83. //信息函数
  84. public:
  85. //获取类型
  86. enOperationType GetOperationType()
  87. {
  88. return m_OperationType;
  89. }
  90. };
  91. //接收重叠结构
  92. class COverLappedSend : public COverLapped
  93. {
  94. //数据变量
  95. public:
  96. BYTE m_cbBuffer[SOCKET_TCP_BUFFER]; //数据缓冲
  97. //函数定义
  98. public:
  99. //构造函数
  100. COverLappedSend();
  101. //析构函数
  102. virtual ~COverLappedSend();
  103. };
  104. //重叠结构模板
  105. template <enOperationType OperationType> class CATLOverLapped : public COverLapped
  106. {
  107. //函数定义
  108. public:
  109. //构造函数
  110. CATLOverLapped() : COverLapped(OperationType) {}
  111. //析构函数
  112. virtual ~CATLOverLapped() {}
  113. };
  114. //////////////////////////////////////////////////////////////////////////
  115. //TCP SOCKET 类
  116. class CServerSocketItem
  117. {
  118. enum ConnectType{
  119. CHECKING,
  120. HANDSHAKING,
  121. WINSOCKET,
  122. WEBSOCKET
  123. };
  124. //连接属性
  125. protected:
  126. DWORD m_dwClientAddr; //连接地址
  127. DWORD m_dwConnectTime; //连接时间
  128. DWORD m_dwPort; //连接端口
  129. TCHAR m_szIp[72];
  130. //核心变量
  131. protected:
  132. WORD m_wRountID; //循环计数
  133. SOCKET m_hSocket; //SOCKET 句柄
  134. CMyEncrypt m_MyEncrypt; //加密对象
  135. public:
  136. ConnectType m_connectType; //websocket 新增
  137. //状态变量
  138. protected:
  139. bool m_bNotify; //通知标志
  140. bool m_bRecvIng; //接收标志
  141. bool m_bCloseIng; //关闭标志
  142. bool m_bAllowBatch; //接受群发
  143. bool m_bForeground; //手机在前台标志//websocket 新增
  144. BYTE m_cbSendMask; //
  145. WORD m_wRecvSize; //接收长度
  146. BYTE m_cbRecvBuf[SOCKET_TCP_BUFFER * 5]; //接收缓冲
  147. //计数变量
  148. protected:
  149. DWORD m_dwSendTickCount; //发送时间
  150. DWORD m_dwRecvTickCount; //接受时间
  151. DWORD m_dwSendPacketCount; //发送计数
  152. DWORD m_dwRecvPacketCount; //接受计数
  153. //加密数据
  154. protected:
  155. BYTE m_cbSendRound; //字节映射
  156. BYTE m_cbRecvRound; //字节映射
  157. DWORD m_dwSendXorKey; //发送密钥
  158. DWORD m_dwRecvXorKey; //接收密钥
  159. //内部变量
  160. protected:
  161. const WORD m_wIndex; //连接索引
  162. CCriticalSection m_CriticalSection; //同步锁定
  163. COverLappedRecv m_OverLappedRecv; //重叠结构
  164. COverLappedSendPtr m_OverLappedSendFree; //重叠结构
  165. COverLappedSendPtr m_OverLappedSendActive; //重叠结构
  166. IServerSocketItemSink * m_pIServerSocketItemSink; //回调接口
  167. //函数定义
  168. public:
  169. //构造函数
  170. CServerSocketItem(WORD wIndex, IServerSocketItemSink * pIServerSocketItemSink);
  171. //析够函数
  172. virtual ~CServerSocketItem(void);
  173. //标识函数
  174. public:
  175. //获取索引
  176. WORD GetIndex()
  177. {
  178. return m_wIndex;
  179. }
  180. //获取计数
  181. WORD GetRountID()
  182. {
  183. return m_wRountID;
  184. }
  185. //获取标识
  186. DWORD GetSocketID()
  187. {
  188. return MAKELONG(m_wIndex, m_wRountID);
  189. }
  190. //辅助函数
  191. public:
  192. TCHAR *GetAddressString(){ return m_szIp; };
  193. //获取地址
  194. DWORD GetClientAddr()
  195. {
  196. return m_dwClientAddr;
  197. }
  198. DWORD GetPort()
  199. {
  200. return htons(m_dwPort);
  201. }
  202. //连接时间
  203. DWORD GetConnectTime()
  204. {
  205. return m_dwConnectTime;
  206. }
  207. //发送时间
  208. DWORD GetSendTickCount()
  209. {
  210. return m_dwSendTickCount;
  211. }
  212. //接收时间
  213. DWORD GetRecvTickCount()
  214. {
  215. return m_dwRecvTickCount;
  216. }
  217. //锁定对象
  218. CCriticalSection& GetSignedLock()
  219. {
  220. return m_CriticalSection;
  221. }
  222. //是准备好
  223. bool IsReadySend()
  224. {
  225. return m_dwRecvPacketCount > 0L;
  226. }
  227. //是否群发
  228. bool IsAllowBatch()
  229. {
  230. return m_bAllowBatch;
  231. }
  232. //websocket 新增
  233. bool isForeground(){
  234. return m_bForeground;
  235. }
  236. BYTE GetBatchMask(){
  237. return m_cbSendMask;
  238. }
  239. //判断连接
  240. bool IsValidSocket()
  241. {
  242. return (m_hSocket != INVALID_SOCKET);
  243. }
  244. //功能函数
  245. public:
  246. //绑定对象
  247. DWORD Attach(SOCKET hSocket, DWORD dwClientAddr, DWORD dwPort);
  248. //发送函数
  249. bool SendData(WORD wMainCmdID, WORD wSubCmdID, WORD wRountID);
  250. //发送函数
  251. bool SendData(void * pData, WORD wDataSize, WORD wMainCmdID, WORD wSubCmdID, WORD wRountID);
  252. //接收操作
  253. bool RecvData();
  254. //关闭连接
  255. bool CloseSocket(WORD wRountID);
  256. //设置关闭
  257. bool ShutDownSocket(WORD wRountID);
  258. //允许群发
  259. bool AllowBatchSend(WORD wRountID, bool bAllowBatch, BYTE cbBatchMask);
  260. //重置变量
  261. void ResetSocketData();
  262. //
  263. void sendDataBuffer(void * pData, WORD wDataSize);
  264. //通知接口
  265. public:
  266. //发送完成通知
  267. bool OnSendCompleted(COverLappedSend * pOverLappedSend, DWORD dwThancferred);
  268. //接收完成通知
  269. bool OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred);
  270. //关闭完成通知
  271. bool OnCloseCompleted();
  272. //内部函数
  273. private:
  274. //加密数据
  275. WORD EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize, BYTE cbDataKind);
  276. //解密数据
  277. WORD CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize);
  278. //内联函数
  279. private:
  280. //随机映射
  281. inline WORD SeedRandMap(WORD wSeed);
  282. //映射发送数据
  283. inline BYTE MapSendByte(BYTE const cbData);
  284. //映射发送数据
  285. inline BYTE MapSendByteEx(BYTE const cbData);
  286. //映射接收数据
  287. inline BYTE MapRecvByte(BYTE const cbData);
  288. //映射接收数据
  289. inline BYTE MapRecvByteEx(BYTE const cbData);
  290. //获取发送结构
  291. inline COverLappedSend * GetSendOverLapped();
  292. //websocket增加的函数 //websocket 新增
  293. private:
  294. //return true mean websocket,false not
  295. bool handshake(zl::net::ByteBuffer* byteBuffer);
  296. bool SendRawData(const char* data, int len);
  297. bool CheckIfWinSocket();
  298. bool HandleWebsocketRecv();
  299. public:
  300. bool isWebSocket();
  301. bool isWinSocket();
  302. bool sendPingFrame();
  303. bool setForeground(bool foreground);
  304. };
  305. //////////////////////////////////////////////////////////////////////////
  306. //读写线程类
  307. class CServerSocketRSThread : public CWHThread
  308. {
  309. //变量定义
  310. protected:
  311. HANDLE m_hCompletionPort; //完成端口
  312. //函数定义
  313. public:
  314. //构造函数
  315. CServerSocketRSThread(void);
  316. //析构函数
  317. virtual ~CServerSocketRSThread(void);
  318. //功能函数
  319. public:
  320. //配置函数
  321. bool InitThread(HANDLE hCompletionPort);
  322. //重载函数
  323. private:
  324. //运行函数
  325. virtual bool OnEventThreadRun();
  326. };
  327. //////////////////////////////////////////////////////////////////////////
  328. //应答线程对象
  329. class CSocketAcceptThread : public CWHThread
  330. {
  331. //变量定义
  332. protected:
  333. SOCKET m_hListenSocket; //监听连接
  334. HANDLE m_hCompletionPort; //完成端口
  335. CTCPNetworkEngine * m_pTCPSocketManager; //管理指针
  336. //函数定义
  337. public:
  338. //构造函数
  339. CSocketAcceptThread(void);
  340. //析构函数
  341. virtual ~CSocketAcceptThread(void);
  342. //功能函数
  343. public:
  344. //配置函数
  345. bool InitThread(HANDLE hCompletionPort, SOCKET hListenSocket, CTCPNetworkEngine * pTCPSocketManager);
  346. //重载函数
  347. private:
  348. //运行函数
  349. virtual bool OnEventThreadRun();
  350. };
  351. //////////////////////////////////////////////////////////////////////////
  352. //检测线程类
  353. class CSocketDetectThread : public CWHThread
  354. {
  355. //变量定义
  356. protected:
  357. DWORD m_dwTickCount; //积累时间
  358. CTCPNetworkEngine * m_pTCPSocketManager; //管理指针
  359. //函数定义
  360. public:
  361. //构造函数
  362. CSocketDetectThread(void);
  363. //析构函数
  364. virtual ~CSocketDetectThread(void);
  365. //功能函数
  366. public:
  367. //配置函数
  368. bool InitThread(CTCPNetworkEngine * pTCPSocketManager);
  369. //重载函数
  370. private:
  371. //运行函数
  372. virtual bool OnEventThreadRun();
  373. };
  374. //////////////////////////////////////////////////////////////////////////
  375. //类说明
  376. typedef CWHArray<CServerSocketItem *> CServerSocketItemPtrArray;
  377. typedef CWHArray<CServerSocketRSThread *> CServerSocketRSThreadPtrArray;
  378. //////////////////////////////////////////////////////////////////////////
  379. //网络引擎
  380. class CTCPNetworkEngine : public ITCPNetworkEngine, public IServerSocketItemSink, public IQueueServiceSink
  381. {
  382. friend class CServerSocketRSThread;
  383. friend class CSocketAcceptThread;
  384. //变量定义
  385. protected:
  386. CCriticalSection m_CriticalSection;
  387. CServerSocketItemPtrArray m_FreeSocketItem; //空闲连接
  388. CServerSocketItemPtrArray m_ActiveSocketItem; //活动连接
  389. CServerSocketItemPtrArray m_StorageSocketItem; //存储连接
  390. //辅助变量
  391. protected:
  392. DWORD m_dwLastDetect; //检测时间
  393. CServerSocketItemPtrArray m_TempSocketItem; //临时连接
  394. //配置变量
  395. protected:
  396. WORD m_wListenPort; //监听端口
  397. WORD m_wMaxSocketItem; //最大连接
  398. protected:
  399. CQueueService m_SendQueueService; //队列对象
  400. CQueueServiceEvent m_QueueServiceEvent; //通知组件
  401. //内核变量
  402. protected:
  403. bool m_bService; //服务标志
  404. SOCKET m_hServerSocket; //连接句柄
  405. HANDLE m_hCompletionPort; //完成端口
  406. CSocketDetectThread m_SocketDetectThread; //检测线程
  407. CSocketAcceptThread m_SocketAcceptThread; //应答线程
  408. CServerSocketRSThreadPtrArray m_SocketRSThreadArray; //读写线程
  409. //函数定义
  410. public:
  411. //构造函数
  412. CTCPNetworkEngine(void);
  413. //析构函数
  414. virtual ~CTCPNetworkEngine(void);
  415. //基础接口
  416. public:
  417. //释放对象
  418. virtual VOID Release()
  419. {
  420. if (IsValid()) delete this;
  421. }
  422. //是否有效
  423. virtual bool IsValid()
  424. {
  425. return AfxIsValidAddress(this, sizeof(CTCPNetworkEngine)) ? true : false;
  426. }
  427. //接口查询
  428. virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
  429. //服务接口
  430. public:
  431. //启动服务
  432. virtual bool StartService();
  433. //停止服务
  434. virtual bool ConcludeService();
  435. //配置接口
  436. public:
  437. virtual WORD GetServicePort()
  438. {
  439. return m_wListenPort;
  440. }
  441. virtual WORD GetCurrentPort()
  442. {
  443. return m_wListenPort;
  444. }
  445. //设置接口
  446. virtual bool SetTCPNetworkEngineEvent(IUnknownEx * pIUnknownEx);
  447. //设置参数
  448. virtual bool SetServiceParameter(WORD wServicePort, WORD wMaxConnect, LPCTSTR pszCompilation);
  449. //队列接口
  450. public:
  451. //通知回调函数
  452. virtual void OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize);
  453. //网络接口
  454. public:
  455. //检测连接
  456. virtual bool DetectSocket();
  457. //发送函数
  458. virtual bool SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID);
  459. //发送函数
  460. virtual bool SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize);
  461. //批量发送
  462. virtual bool SendDataBatch(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize, BYTE cbBatchMask);
  463. //关闭连接
  464. virtual bool CloseSocket(DWORD dwSocketID);
  465. //设置关闭
  466. virtual bool ShutDownSocket(DWORD dwSocketID);
  467. //允许群发
  468. virtual bool AllowBatchSend(DWORD dwSocketID, bool bAllow, BYTE cbBatchMask);
  469. //通知接口
  470. public:
  471. //应答消息
  472. virtual bool OnSocketAcceptEvent(CServerSocketItem * pServerSocketItem);
  473. //读取消息
  474. virtual bool OnSocketReadEvent(TCP_Command Command, void * pBuffer, WORD wDataSize, CServerSocketItem * pServerSocketItem);
  475. //关闭消息
  476. virtual bool OnSocketCloseEvent(CServerSocketItem * pServerSocketItem);
  477. //同步消息
  478. virtual bool OnTBDataEvent(int iCommend, DWORD dwContextID, void * pBuffer, WORD wDataSize);
  479. virtual bool OnSocketForegroundEvent(CServerSocketItem* pServerSocketItem); //websocket 新增
  480. //内部函数
  481. protected:
  482. //激活空闲对象
  483. CServerSocketItem * ActiveSocketItem();
  484. //获取对象
  485. CServerSocketItem * EnumSocketItem(WORD wIndex);
  486. //释放连接对象
  487. bool FreeSocketItem(CServerSocketItem * pServerSocketItem);
  488. CString dwIP2csIP(DWORD dwIP);
  489. };
  490. #endif