// ClientComm.h: interface for the CClientComm class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_) #define AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #if defined(_MSC_VER) #include "RVCComm.h" #include #else // 调整了位置,解决出现编译错误 error C2011: “sockaddr”:“struct”类型重定义 2020年1月21日 #include #include "RVCComm.h" #endif //_MSC_VER #include "AutoLock.h" #define CONN_OPT_SHARED_SESSION 4 //不协商,直接使用共享会话密钥 #define CONN_OPT_NAKED 3 //不使用会话密钥,即非安全通道 #define CONN_OPT_CACHED_SESSION 2 //通过握手使用缓存会话密钥 #define CONN_OPT_REDIRECT_SESSION 1 //重新鉴权新建会话密钥 class CClientComm : public IClientCommFunc { public: CClientComm(CSecureClientBase *pCallback); virtual ~CClientComm(); bool IsConnectionOK(); bool IsSecureConnection(); // 创建连接,@option:1、重新鉴权新建会话密钥;2、通过握手使用缓存会话密钥;3、不使用会话密钥,即非安全通道 // 4、不协商,直接使用共享会话密钥 bool Connect(const char *pServerAddr, int nPort, int nOption); void Close(); string SendPackage(const CSmartPointer& pSendPkg); CSmartPointer ReceivePackage(int nWaitSecond); CSmartPointer CreateNewPackage(const char *pServiceCode); CSmartPointer CreateReplyPackage(const CSmartPointer& pRecvPkg); //void SetSessionKey(BYTE arrSessionKey[16]); private: #if defined(_MSC_VER) static UINT _stdcall RecvThreadFunc(void* pArg); #else static DWORD RecvThreadFunc(void* pArg); #endif //_MSC_VER void RecvThreadProcess(); //void ReceivePackageData(); void SetSocketOption(); int GetPackageLenFromRecvBuf(); bool SendAuthReqPackage(); bool HandleAuthRetPackage(const CSmartPointer &pRetPkg); bool SendShakeReqPackage(); bool HandleShakeRetPackage(const CSmartPointer &pRetPkg); bool SendUseSharedSKPackage(); bool HandleUseSharedSKRetPackage(const CSmartPointer &pRetPkg); bool SendHelloReqPackage(); bool HandleHelloRetPackage(const CSmartPointer &pRetPkg); private: enum ConnStateEnum { State_None = 0, State_Connecting, State_OK, State_Closed, State_Disconnected, State_Error, }; CSecureClientBase *m_pCallback; SOCKET m_hSocket; HANDLE m_hWorkThread; CLockObject m_LockObject; ConnStateEnum m_eState; bool m_bNeedAuth; std::vector m_RecvPackages; HANDLE m_hRecvEvent; volatile LONG m_nSyncWaitResult; const int SOCKET_RECV_BUF_LEN; BYTE *m_pRecvBuf; int m_nRecvBufLen; int m_nHasRecvLen; DWORD m_dwSessionID; DWORD m_dwTokenHash; BYTE m_arrSessionKey[16]; // 缓存上次会话标识 static DWORD s_dwSessionID; static DWORD s_dwTokenHash; static BYTE s_arrSessionKey[16]; }; #endif // !defined(AFX_CLIENTCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_)