PipeClient.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #include "Protocol.h"
  3. #include "CritSection.h"
  4. #define BUFSIZE 4096
  5. typedef struct _PER_IO_CONTEXT
  6. {
  7. OVERLAPPED m_Overlapped;
  8. BYTE szBuffer[BUFSIZE];
  9. DWORD dwBufferSize;
  10. _PER_IO_CONTEXT()
  11. {
  12. dwBufferSize = 0;
  13. memset(&m_Overlapped, 0, sizeof(OVERLAPPED));
  14. memset(szBuffer, 0, BUFSIZE);
  15. m_Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  16. }
  17. ~_PER_IO_CONTEXT()
  18. {
  19. if ( m_Overlapped.hEvent != NULL )
  20. {
  21. SetEvent(m_Overlapped.hEvent);
  22. CloseHandle(m_Overlapped.hEvent);
  23. }
  24. }
  25. }PER_IO_CONTEXT, *PPER_IO_CONTEXT;
  26. // 连接成功时,向服务器发送消息;
  27. typedef BOOL(CALLBACK* OnConnected)();
  28. class CPipeClient
  29. {
  30. public:
  31. // 客户端只有PIPE_READMODE_BYTE PIPE_READMODE_MESSAGE两种模式;
  32. CPipeClient(LPCTSTR lpPipeName, DWORD dwMode=PIPE_READMODE_MESSAGE);
  33. ~CPipeClient(void);
  34. private:
  35. // 管道句柄;
  36. HANDLE m_hPipeInst;
  37. // 客户端状态;
  38. BOOL m_bClientStop;
  39. // 管道名称;
  40. TCHAR m_szPipeName[MAX_PATH];
  41. // 管道通信模式;
  42. DWORD m_dwMode;
  43. static std::string m_LastData;
  44. static PER_IO_CONTEXT m_IoRead;
  45. static ThreadSection m_cs;
  46. // Write使用同步方式;
  47. static PER_IO_CONTEXT m_IoWrite;
  48. static BOOL m_bPipeConnectStatus;
  49. public:
  50. BOOL StartWork();
  51. void StopWork() { m_bClientStop = TRUE;Sleep(100000);}
  52. // 连续管道服务器线程;
  53. static DWORD WINAPI ConnectThread(LPVOID lpParam);
  54. // 读取管道消息线程;
  55. static DWORD WINAPI ReadMsgThread(LPVOID lpParam);
  56. // 等待重叠IO完成;
  57. static BOOL WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext);
  58. // 处理消息;
  59. static void HandleMsg(DATAHEADER &head, MSG_INFO &msg);
  60. // 发送消息给服务端;
  61. BOOL SendPackage(PACKAGE &pak);
  62. BOOL SendPackage(DATAHEADER &head, MSG_INFO &msg);
  63. void HandleError(DWORD dwError);
  64. protected:
  65. BOOL SendData(LPBYTE lpData, DWORD dwDataLen);
  66. };