/************************************************************************/ /* Copyright (C), 2016-2020, [IT], 保留所有权利; /* 模 块 名:IServerImpl; /* 描 述:核心层底,客户端与服务端通信接口; /* /* 版 本:[V]; /* 作 者:[IT]; /* 日 期:[2/23/2016]; /* /* /* 注 意:; /* /* 修改记录:[IT]; /* 修改日期:; /* 修改版本:; /* 修改内容:; /************************************************************************/ #ifndef __ISERVER_IMPL_HEADER__ #define __ISERVER_IMPL_HEADER__ #pragma once #include #include //#pragma warning(push) //#pragma warning(disable:4995) #include //#pragma warning(pop) #include "CritSection.h" #include "SocketHandle.h" #include "SocketServerImpl.h" #include "Client2SrvType.h" #if defined(SOCKHANDLE_USE_OVERLAPPED) #include "AsyncSocketServerImpl.h" #endif //#include "SocketSvrImpl.h" // 宏定义:计算数据包总长度; #define CALCDATALEN(x) (x+sizeof(STProtocolheader)+sizeof(STProtocoltail)) // 使用通信这一块,完全分离出来; namespace ServerSocketImpl { typedef std::list CSocketList; class IServerImpl :public ISocketServerHandler { #if defined(SOCKHANDLE_USE_OVERLAPPED) typedef ASocketServerImpl CSocketServer; #else typedef SocketServerImpl CSocketServer; #endif friend CSocketServer; public: IServerImpl(); ~IServerImpl(); virtual void OnThreadBegin(CSocketHandle* pSH); virtual void OnThreadExit(CSocketHandle* pSH); virtual void OnAddConnection(CSocketHandle* pSH, SOCKET newSocket); //virtual void OnDataReceived(CSocketHandle* pSH, const SOCKET sClient, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr, BYTE **pendingbuf, unsigned int& npendingSize, unsigned int& ncursize); virtual void OnDataReceived(LPWSAOVERLAPPED pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr); virtual void OnConnectionFailure(CSocketHandle* pSH, SOCKET newSocket); virtual void OnConnectionDropped(CSocketHandle* pSH); virtual void OnConnectionError(CSocketHandle* pSH, DWORD dwError); #if defined(SOCKHANDLE_USE_OVERLAPPED) virtual void OnRemoveConnection(CSocketHandle* pSH , SOCKET dropSocket); //virtual void OnThreadLoopEnter(CSocketHandle* pSH); //virtual void OnThreadLoopLeave(CSocketHandle* pSH); #endif protected: CString m_strPort; int m_nPort; int m_nMode; int m_nSockType; CSocketServer m_SocketServer; 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); void ToprocessRecivebuf(IN PerSocketContext &sockIOBuffer, IN const BYTE* pReceivebuf, IN DWORD dwReceiveSize); //int OnIntegrityPacket(IN CSocketHandle &sockHandle, IN void *pIntegrityPacket); int OnIntegrityPacket(IN PerSocketContext &sockHandle, IN void *pIntegrityPacket); public: BOOL m_bStopbeat; int m_nSocketIndex; CRITICAL_SECTION m_csProcessData; DWORD GetClientConnectCount(); BOOL Initialize(); void Start(IN LPCTSTR strPort,IN const int &nMode); void Stop(); void Send(); void SendAll(CSocketHandle &sockHandle, unsigned char *pMsg, int nLength); HANDLE m_hClearInvalidateSocketThread; HANDLE m_hRunObject; void StartClearInvalidateSocketThread(); static DWORD WINAPI ClearInvalidateSocketThread(void *pInstance); private: CSocketHandle m_SocketFile; public: ////////////////////////////////////////////////////////////////////////// // 项目接口; }; extern IServerImpl* g_pServerSocket; }; #endif