ClientComm.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // ClientComm.h: interface for the CClientComm class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_)
  5. #define AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #if defined(_MSC_VER)
  10. #include "RVCComm.h"
  11. #include <winsock2.h>
  12. #else
  13. // 调整了位置,解决出现编译错误 error C2011: “sockaddr”:“struct”类型重定义 2020年1月21日
  14. #include <winpr/winsock.h>
  15. #include "RVCComm.h"
  16. #endif //_MSC_VER
  17. #include "AutoLock.h"
  18. #define CONN_OPT_SHARED_SESSION 4 //不协商,直接使用共享会话密钥
  19. #define CONN_OPT_NAKED 3 //不使用会话密钥,即非安全通道
  20. #define CONN_OPT_CACHED_SESSION 2 //通过握手使用缓存会话密钥
  21. #define CONN_OPT_REDIRECT_SESSION 1 //重新鉴权新建会话密钥
  22. class CClientComm : public IClientCommFunc
  23. {
  24. public:
  25. CClientComm(CSecureClientBase *pCallback);
  26. virtual ~CClientComm();
  27. bool IsConnectionOK();
  28. bool IsSecureConnection();
  29. // 创建连接,@option:1、重新鉴权新建会话密钥;2、通过握手使用缓存会话密钥;3、不使用会话密钥,即非安全通道
  30. // 4、不协商,直接使用共享会话密钥
  31. bool Connect(const char *pServerAddr, int nPort, int nOption);
  32. void Close();
  33. string SendPackage(const CSmartPointer<IPackage>& pSendPkg);
  34. CSmartPointer<IPackage> ReceivePackage(int nWaitSecond);
  35. CSmartPointer<IPackage> CreateNewPackage(const char *pServiceCode);
  36. CSmartPointer<IPackage> CreateReplyPackage(const CSmartPointer<IPackage>& pRecvPkg);
  37. //void SetSessionKey(BYTE arrSessionKey[16]);
  38. private:
  39. #if defined(_MSC_VER)
  40. static UINT _stdcall RecvThreadFunc(void* pArg);
  41. #else
  42. static DWORD RecvThreadFunc(void* pArg);
  43. #endif //_MSC_VER
  44. void RecvThreadProcess();
  45. //void ReceivePackageData();
  46. void SetSocketOption();
  47. int GetPackageLenFromRecvBuf();
  48. bool SendAuthReqPackage();
  49. bool HandleAuthRetPackage(const CSmartPointer<IPackage> &pRetPkg);
  50. bool SendShakeReqPackage();
  51. bool HandleShakeRetPackage(const CSmartPointer<IPackage> &pRetPkg);
  52. bool SendUseSharedSKPackage();
  53. bool HandleUseSharedSKRetPackage(const CSmartPointer<IPackage> &pRetPkg);
  54. bool SendHelloReqPackage();
  55. bool HandleHelloRetPackage(const CSmartPointer<IPackage> &pRetPkg);
  56. private:
  57. enum ConnStateEnum
  58. {
  59. State_None = 0,
  60. State_Connecting,
  61. State_OK,
  62. State_Closed,
  63. State_Disconnected,
  64. State_Error,
  65. };
  66. CSecureClientBase *m_pCallback;
  67. SOCKET m_hSocket;
  68. HANDLE m_hWorkThread;
  69. CLockObject m_LockObject;
  70. ConnStateEnum m_eState;
  71. bool m_bNeedAuth;
  72. std::vector<IPackage*> m_RecvPackages;
  73. HANDLE m_hRecvEvent;
  74. volatile LONG m_nSyncWaitResult;
  75. const int SOCKET_RECV_BUF_LEN;
  76. BYTE *m_pRecvBuf;
  77. int m_nRecvBufLen;
  78. int m_nHasRecvLen;
  79. DWORD m_dwSessionID;
  80. DWORD m_dwTokenHash;
  81. BYTE m_arrSessionKey[16];
  82. // 缓存上次会话标识
  83. static DWORD s_dwSessionID;
  84. static DWORD s_dwTokenHash;
  85. static BYTE s_arrSessionKey[16];
  86. };
  87. #endif // !defined(AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_)