/************************************************************* /* Copyright (C), 2014-2020, lyfz. Co., Ltd. /* 文件名: IClientImpl.h /* 作者: Jeff.w /* 创建日期: 2014-08-07 /* 版本号: V1.0 /* 描述: 核心层底,客户端与服务端通信接口 /* 其它: /* 主要类模块: /* 历史修改记录: /* 作者 时间 版本 描述 /* Jeff.w 14/08/07 1.0 创建这个模块 ***************************************************************/ #ifndef __ICLIENT_IMPL_HEADER__ #define __ICLIENT_IMPL_HEADER__ #pragma once #include #include //#pragma warning(push) //#pragma warning(disable:4995) //#pragma warning(pop) #include "CritSection.h" #include "SocketHandle.h" #include "SocketClientImpl.h" #include "Client2SrvType.h" #if 1 #define RemoteSvr _T("lijiafz.vicp.net") #else #define RemoteSvr _T("192.168.1.31") //#define RemoteSvr _T("192.168.1.223") #endif //#include "Global.h" // 宏定义:计算数据包总长度; #define CALCDATALEN(x) (x+sizeof(STProtocolheader)+sizeof(STProtocoltail)) //const int TCPCLIENTNUM = 10; class IClientImpl : public ISocketClientHandler { typedef SocketClientImpl CSocketClient; friend CSocketClient; public: IClientImpl(); ~IClientImpl(); void StartReConnectSrvThread(); static DWORD WINAPI ReConnectSrvThread(LPVOID pInstance); protected: virtual void OnThreadBegin(CSocketHandle* pSH); virtual void OnThreadExit(CSocketHandle* pSH); virtual void OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr); virtual void OnConnectionDropped(CSocketHandle* pSH); virtual void OnConnectionError(CSocketHandle* pSH, DWORD dwError); protected: int m_nMode; // IPV4 或 IPV6 int m_nSockType; // UDP 或 TCP // 连接的服务器地址; TCHAR m_SvrAddr[MAX_PATH]; // 连接的服务器端口; TCHAR m_SvrPort[MAX_PATH]; // 线程句柄; HANDLE m_hReConnectSrvThreadHandle; // 线程退出句柄; HANDLE m_hRunObject; //static IClientImpl *m_pTcpClient[TCPCLIENTNUM]; void _cdecl AppendText(LPCTSTR lpszFormat, ...); void GetAddress(const SockAddrIn& addrIn, CString& rString) const; bool GetDestination(SockAddrIn& addrIn) const; bool SetupMCAST(); // Jeff.最新研究出来的处理方案; // 对异常包需要计数处理,当1分钟内出现多少异常包时,需要重启服务函数; //unsigned int VerityIntegrityPacket(IN void *pIntegrityPacket,unsigned int nPacketSize); void ToprocessRecivebuf(IN CSocketHandle *sockHandle, IN const BYTE* pReceivebuf, IN DWORD dwReceiveSize); public: BOOL m_bRecevie; // 是否已接收服务器的返回; BOOL m_bStopbeat; // 是否心跳包; BOOL m_bSocket; // 套接字是否打开; CSocketClient m_SocketClient; BOOL Initialize(); BOOL ConnectServer(LPCTSTR strAddr, LPCTSTR strPort); void DisConnectServer(); void SendMsg(void *pMsg,const int nLen); BOOL SolveDBError(); public: // .用户登陆服务器请求; BOOL LoginRemoteSvrRequest(); BOOL LoginLocalSvrRequest(); // .用户登陆服务请求,服务器的响应返回; void LoginRemoteSvrResponse(void *pLoginResult); void LoginLocalSvrResponse(void *pLoginResult); // .客户端登陆后,聊天数据请求; BOOL ChatRemoteSvrMessageRequest(void *szDataBuf, int nDataLen); BOOL ChatLocalSvrMessageRequest(void *szDataBuf, int nDataLen);//ChatLocalSvrMessageRequest // .客户端登陆后,聊天数据请求,服务端的响应返回; void ChatRemoteSvrMessageResponse(void *pResponse); void ChatLocalSvrMessageResponse(void *pResponse); void DataToArray(IN BYTE *pData, IN CONST DWORD &dwLength, IN CArray*List1array); public: DWORD m_dwCurRecive; // 当前接收的字节; DWORD m_dwSumRecive; // 总接收的字节; BYTE *m_pRecivebuf; // 接收的缓存; DWORD m_dwSendCode; SENDHEAD m_tSendhead; public: std::vector _data; // 接收到数据; void ReAlloc(size_t count){ _data.resize(count);} void Free() { _data.clear(); } size_t BufferSize() const {return _data.size();} operator LPBYTE() { return &_data[0]; } }; #endif