| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | #include "stdafx.h"#include "SuperManager.h"#include <ODBC/DBConnectPool.h>#include <ZlDataDefine.h>#include <Simplelog.h>#include <AppService.h>CSendTask::CSendTask(LPBYTE pPack, int nPackLen, uint32_t no, E_ZL_PROTOCAL proto, bool r){	pdata = new BYTE[nPackLen];	//SPDLOG_ERROR("mem:new {:X}", (DWORD_PTR)pdata);	memcpy(pdata, pPack, nPackLen);	nlen = nPackLen;	this->packno = no;	this->protocal = proto;	bRePeatSend = r;}void CSendTask::join(){	delete this;}CSendTask::~CSendTask(){	//SPDLOG_ERROR("mem:del {:X}", (DWORD_PTR)pdata);	delete[] pdata;	pdata = nullptr;	nlen = 0;}CSuperManager::CSuperManager(){}CSuperManager::~CSuperManager(){	Stop();}BOOL CSuperManager::Start(CString m_strIniPath, uint16_t port /*= 10089*/){	Stop();	m_super_num = ::GetPrivateProfileInt("SET", "super_num", 0, m_strIniPath);	::WritePrivateProfileStringA("SET", "super_num", (to_string(m_super_num) + " #推送个数").c_str(), m_strIniPath);	if (m_super_num == 0 || m_super_num > 10) return TRUE;	//m_handler = new CSuperHandler();	for (size_t i = 1; i <= m_super_num; i++)	{		char szTemp[100] = { 0 };		::GetPrivateProfileStringA("SET", fmt::format("super_ip_{}", i).c_str(), "", szTemp, sizeof(szTemp), m_strIniPath);		if (szTemp[0x00] == 0x00)		{			::WritePrivateProfileStringA("SET", fmt::format("super_ip_{}", i).c_str(), "127.0.0.1", m_strIniPath);			continue;		}		uint16_t p = ::GetPrivateProfileInt("SET", fmt::format("super_port_{}", i).c_str(), 10090, m_strIniPath);		//添加记录		auto& it = m_super[szTemp];		strcpy_s(it.ip, 16, szTemp);		it.port = p;		it.addr.sin_family = AF_INET;		inet_pton(AF_INET, szTemp, &it.addr.sin_addr);		it.addr.sin_port = htons(p);		//设置缓冲区		//it.m_socket.SetBuffer(&it.m_buffer);		it.m_client.SetBuffer(&it.m_buffer);		it.m_client.set_addr(it.addr);		//设置处理器		it.handler.SetFather(&it);		it.handler.SetClient(&it.m_client);		it.m_client.SetProtocolHandler(&it.handler);		auto ret = it.m_client.conn_server();  //链接服务器		if (ret != 0) return FALSE;	}	m_bWork = true;	m_pThread = new std::thread(ThreadProcForSend, (DWORD_PTR)this);	return TRUE;}void CSuperManager::Stop(){	m_bWork = false;	if (m_pThread)	{		m_pThread->join();		delete m_pThread;		m_pThread = nullptr;	}	//if (m_socket)	//{	//	m_socket->Close();	//	m_socket = nullptr;	//}	//关闭链路	for (auto& it : m_super)	{		it.second.m_socket.Close();		it.second.m_client.close();	}	Sleep(0);	m_super.clear();}CSuperManager CSuperManager::obj;void CSuperManager::ThreadProcForSend(DWORD_PTR pThis){	auto pService = (CSuperManager*)pThis;	uint32_t last_pack_no = 0;	E_ZL_PROTOCAL last_protocal = E_ZL_PROTOCAL::ZL_UNREALIZED;	bool bSleep = false;	time_t tmNow;	uint8_t bBeart[100] = { 0 };	int nBeart = CHjDataConver::conver_sendpack(bBeart, 0, 0, 0, 0, E_ZL_PROTOCAL::ZL_KEEP, 		OR_DATA_INFO(0, 0, 1, 2, OPT_TYPE::OPT_SYNC));	time_t tmLastConnTime = 0;	time_t tmLastSendBeart = 0; 	do 	{		time(&tmNow);		Sleep(950);		//if (tmLastConnTime != tmNow)		//{//每秒重连一次		//	tmLastConnTime = tmNow;		//	for (auto& it : pService->m_super)		//	{		//		if (it.second.m_socket.IsInactive(180))		//		{		//			SPDLOG_INFO("TCP重连 {}:{}", it.second.ip, it.second.port);		//			it.second.m_socket.Close();		//			if (false == it.second.m_socket.ConnectServer(it.second.ip, it.second.port))		//				SPDLOG_WARN("TCP重连失败 {}:{}", it.second.ip, it.second.port);		//		}		//	}		//}		if (tmNow - tmLastSendBeart >= 30)		{//30秒发送一次心跳			tmLastSendBeart = tmNow;			for (auto& it : pService->m_super)			{				//auto ret = it.second.m_socket.Send(bBeart, nBeart);				auto ret = it.second.handler.Send(bBeart, nBeart);				if (ret)				{					it.second.sendlen += nBeart;					if (it.second.tmLastSendBeart == 0) it.second.tmLastSendBeart = tmNow;					auto dif = tmNow - it.second.tmLastSendBeart;					it.second.tmLastSendBeart = tmNow;					if (dif > 180)						SPDLOG_WARN("心跳发送间隔超时{}:{},{} s", it.second.ip, it.second.port, dif);				}			}		}		{//1秒重新发送一次			for (auto& it : pService->m_super)				//it.second.m_socket.ReSend();				it.second.handler.ReSend();		}	} while (pService->m_bWork);}
 |