| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | #pragma once//#include <fmt/core.h>#include <winsock2.h>class ITCPServer;//连接客户端信息struct ClientInfo{	SOCKET sock;	SOCKADDR_IN clientAddr;////定义地址族	TCHAR strIP[128];	//ipv6地址长度	int iPort;	bool bIsTransmit;	int iSendSucCount;	int iSendFailCount;	int iRecvCount;	ITCPServer * pTcpServer1;  //创建该 clientInfo的TcpServer 的指针		void* pAppLayerClt; //应用层客户端信息对象	//用于绑定一些用户自定义数据,默认无用	void* pData1;	void* pData2;	void* pData3;	int iData1;	bool isValid;	SYSTEMTIME stLastActive;	SYSTEMTIME stCreateTime;	ClientInfo()	{		GetLocalTime(&stCreateTime);		GetLocalTime(&stLastActive);		sock = NULL;		pAppLayerClt = NULL;		pData1 = NULL;		pData2 = NULL;		pData3 = NULL;		pTcpServer1 = NULL;		iData1 = 0;		bIsTransmit = false;		iSendSucCount = 0;		iSendFailCount = 0;		iRecvCount = 0;		memset(strIP, 0, 16);		isValid = true;	}	inline std::string GetAddressStr()	{		return fmt::format("{}:{}", strIP, iPort);	}	ClientInfo* GenerateClienInfo(){		ClientInfo *ptr;		ptr = new ClientInfo();		if (ptr) {			*ptr = *this;			ptr->pTcpServer1 = NULL;			ptr->pData1 = NULL;			ptr->pData2 = NULL;			ptr->pData3 = NULL;		}		return ptr;	}};//该结构体只适用于指针调用typedef struct connHistoryInfo {	CString strIp;	SOCKET socket;	HANDLE m_mutex;	int iSendSucCount;	int iSendFailCount;	int iRecvCount;	int iReconnnectCount;	bool bOnline;	ClientInfo *pCltInfo;	SYSTEMTIME lastConnectTime;	bool bProxy;		//代理标志	bool bRecving;		//开始接收数据	//ConnHistoryData historyData;//历史数据预留 暂时不用	connHistoryInfo() {		pCltInfo = NULL;		strIp = "";		socket = 0;		iSendSucCount = 0;		iSendFailCount = 0;		iRecvCount = 0;		iReconnnectCount = 0;		bOnline = false;		bProxy = false;		bRecving = false;		memset(&lastConnectTime, 0, sizeof(SYSTEMTIME));		m_mutex = CreateMutex(NULL, FALSE, NULL);	}	~connHistoryInfo() {		if (m_mutex) {			CloseHandle(m_mutex);			m_mutex = NULL;		}	}	bool Lock() {		if (m_mutex) {			WaitForSingleObject(m_mutex, INFINITE);			return true;		}		return false;	}	void Unlock() {		if (m_mutex) ReleaseMutex(m_mutex);	}}ConnHistoryInfo;interface ITcpServerCallBack {public:	virtual void ConnStatusChange(ClientInfo* pCltInfo, BOOL bIsConn) = 0;	virtual void OnRecvData_TCPServer(BYTE* pData,int iLen, ClientInfo* pCltInfo) = 0;};class ITCPServer{public:	//服务器控制 strLocalIP传入为空= "" ,则绑定所有本地ip	virtual bool StartServer(ITcpServerCallBack* pUser, int iPort, CString strLocalIP = _T("")) =0;	virtual void StopServer() = 0;	//自动关闭长期未活动连接 0不自动关闭 单位秒	int iAutoClearDeadConnectionTime; 	//数据发送,发往某个客户端	virtual BOOL SendData(const char* pData, int iLen, ClientInfo* pCltInfo) = 0;	virtual BOOL SendData(const char* pData, int iLen, CString strIP) = 0;	ITCPServer()		:m_strName("TCPIOCP")		, m_strMonitoringIP("")		,m_bStopRecv(FALSE)	{		iAutoClearDeadConnectionTime = 0;	}	virtual CString GetIOCPName() {		return m_strName;	}	virtual void SettIOCPName(CString strName) {		m_strName = strName;	}	virtual void SetMonitoring(CString value) {		m_strMonitoringIP = value;	}	virtual CString GetMonitoring() const {		return m_strMonitoringIP;	}	virtual BOOL GetStopRecvStatus() const {		return m_bStopRecv;	}	virtual void SetStopRecvStatus(BOOL b) {		m_bStopRecv = b;	}	virtual ITCPServer *GetChildren() { return NULL; }	//获取IP列表	virtual void GetIPList(std::vector<CString> &vec) = NULL;	virtual void GetConnectInfo(std::vector<ClientInfo *> &vec) = NULL;	virtual void GetHistoryConnectInfo(std::map<CString, ConnHistoryInfo *> &mapHis) = NULL;	virtual ConnHistoryInfo * GetHistoryConnectInfo(const CString &strIP) = NULL;	virtual void ClearConnHistoryInfo() = NULL;private:	CString m_strName;	CString m_strMonitoringIP;	BOOL m_bStopRecv;//该功能用于通信调试分析诊断问题,本地停止从Tcp缓冲接收数据,导致对端Tcp缓冲区满,测试对端程序处理缓冲区满时候的健壮性};
 |