⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platformdlg.cpp

📁 用Visual C++开发的联通短信平台
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{

	using namespace SGIP;
	CoInitialize(NULL);
	IsMTConnected = FALSE;

	//////////////////////////连接ISMG//////////////////////////////////
	BOOL nResult = FALSE;
	if (!IsMTConnected)	//如果没有连接上
		nResult = SGIPMTConnectISMG();

	while (!nResult)
	{
		Sleep(2000);
		nResult = SGIPMTConnectISMG();
	}

	while (!IsMTConnected) //等待连接成功
		Sleep(1);

	/////////////////////////////从消息队列中取出消息并发送//////////////////////////////////
	//填充SUBMIT结构
	struct tagSUBMIT
	{
		MessageHeader head;
		SSubmit body;
	}Submit;

	_ConnectionPtr pCon1 = NULL;
	/////////////////////////////连接数据库//////////////////////////////////////
	csConfig.Lock();
	CString strCon = "Provider=SQLOLEDB; Server=";
	strCon = strCon + g_config.DBServer;
	strCon = strCon + "; Database=";
	strCon = strCon + g_config.Database;
	strCon = strCon + "; uid=";
	strCon = strCon + g_config.DBUser;
	strCon = strCon + "; pwd=";
	strCon = strCon + g_config.DBPwd;
	csConfig.Unlock();
	try
	{
		pCon1 = NULL;
		HRESULT hr = pCon1.CreateInstance(__uuidof(Connection));
		if (FAILED(hr))
		{
			::MessageBox(NULL,"连接数据库失败","连接数据库失败",MB_OK | MB_ICONWARNING);
			return TRUE;
		}
		pCon1->Open(strCon.AllocSysString(),"", "", adConnectUnspecified);
	}
	catch (_com_error &e) 
	{
		::MessageBox(NULL,e.Description(),"连接数据库失败",MB_OK | MB_ICONWARNING);
	}	


	for(;1;)
	{
		csMT.Lock();
		int nMTSize = MTQueue.size();
		csMT.Unlock();
		if (nMTSize == 0) //检查MTQueue是否为空
		{
			Sleep(10);
			continue;
		}
		csMT.Lock();
		CMessage msg = MTQueue.front();
		csMT.Unlock();
		CString Mobile(msg.sMobileNum);

		if (Mobile == "MTActiveTest")
		{
			MessageHeader head;
			head.nCommandID = htonl(SGIP_ACTIVE_TEST);
			csConfig.Lock();
			head.nSeqNumber[0] = htonl(g_config.SPNODEID);	//源节点编号
			csConfig.Unlock();

			head.nSeqNumber[1] = htonl(GenTimeData());		//时间戳
			head.nSeqNumber[2] = htonl(0);			//在SUBMIT结构里面nSequenceID为消息的nRecID
			head.nTotalLen = htonl(sizeof(MessageHeader));

			int nResult = send(mtsocket, (char*)&head, sizeof(MessageHeader), 0);
			if (SOCKET_ERROR == nResult || 0 == nResult)
			{
				Write2RichEditAndLog("发送ACTIVETEST消息时MT和短信网关的连接已经断开");
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

				CloseSocket(mtsocket);
				IsMTConnected = FALSE;

				//////////////////////////连接ISMG///////////////////////////////////////////////////
				nResult = FALSE;
				while (!nResult)
				{
					Sleep(2000);
					nResult = SGIPMTConnectISMG();		
				}
				int nStep = 0;
				while (!IsMTConnected)
				{
					Sleep(10);
					nStep += 1;
					if (nStep > 200)	//如果等待IsMTConnected超时,则关闭连接并继续
					{
						CloseSocket(mtsocket);
						break;
					}
				}
				continue;
			}
			//////////////////////////////////////删除队列头//////////////////////////////////////////
			csMT.Lock();
			MTQueue.pop_front();
			csMT.Unlock();
			continue;

		}


		Submit.head.nCommandID = htonl(SGIP_SUBMIT);									//命令ID
		csConfig.Lock();
		Submit.head.nSeqNumber[0] = htonl(g_config.SPNODEID);							//源节点编号
		csConfig.Unlock();

		Submit.head.nSeqNumber[1] = htonl(GenTimeData());								//时间戳
		Submit.head.nSeqNumber[2] = htonl(msg.nRecID);									//在SUBMIT结构里面nSequenceID为消息的nRecID
		Submit.head.nTotalLen = htonl(sizeof(Submit) + strlen(msg.sMsg) + 8);			//长度

		memset(Submit.body.sSPNumber, 0, 21);
		csConfig.Lock();
		memcpy(Submit.body.sSPNumber, msg.sSrcMobile, strlen(msg.sSrcMobile));			//SP特服号
		csConfig.Unlock();
		memset(Submit.body.sChargeNumber, 0, 21);
		memcpy(Submit.body.sChargeNumber, msg.sChargeNumber, strlen(msg.sChargeNumber));	//付费号码
		Submit.body.nUserCount = 1;															//终端用户数量
		memset(Submit.body.sUserNumber, 0, 21);
		memcpy(Submit.body.sUserNumber, msg.sMobileNum, strlen(msg.sMobileNum));			//目的手机号码
		memset(Submit.body.sCorpId, 0, 5);
		csConfig.Lock();
		memcpy(Submit.body.sCorpId, g_config.SPID, g_config.SPID.GetLength());				//企业代码
		csConfig.Unlock();
		memset(Submit.body.sServiceType, 0, 10);
		memcpy(Submit.body.sServiceType, msg.sServiceID, strlen(msg.sServiceID));			//业务代码
		if (msg.sFeeType == 10)		//此SUBMIT用于产生包月话单
		{
			Submit.body.nMorelatetoMTFlag = 2;					//引起MT消息的原因,SP管理系统下需要改为2
			Submit.body.nFeeType = 3;							//计费用户类型为包月
			Submit.body.nReportFlag = 3;						//该条消息仅携带包月计费信息,不下发给用户,要返回状态报告

		}
		else if (msg.sFeeType == 6)	//定制成功通知消息
		{
			Submit.body.nMorelatetoMTFlag = 0;				//引起MT消息的原因
			Submit.body.nFeeType = 1;						//计费用户类型
			Submit.body.nReportFlag = 0;					//该条消息出错时返回状态报告
			strcpy(msg.sFeeCode, "000000");

		}
		else if (msg.sFeeType == 7)	//定制失败通知消息
		{
			Submit.body.nMorelatetoMTFlag = 2;				//引起MT消息的原因
			Submit.body.nFeeType = 1;						//计费用户类型
			Submit.body.nReportFlag = 0;					//该条消息出错时返回状态报告
			strcpy(msg.sFeeCode, "000000");
			memcpy(Submit.body.sChargeNumber, "000000000000000000000", 21);	//付费号码

		}
		else if (msg.sFeeType == 8)	//退定成功通知消息
		{
			Submit.body.nMorelatetoMTFlag = 0;				//引起MT消息的原因
			Submit.body.nFeeType = 1;						//计费用户类型
			Submit.body.nReportFlag = 0;					//该条消息出错时返回状态报告
			strcpy(msg.sFeeCode, "000000");

		}
		else if (msg.sFeeType == 9)	//退定失败通知消息
		{
			Submit.body.nMorelatetoMTFlag = 2;				//引起MT消息的原因
			Submit.body.nFeeType = 1;						//计费用户类型
			Submit.body.nReportFlag = 0;					//该条消息出错时返回状态报告
			strcpy(msg.sFeeCode, "000000");
			memcpy(Submit.body.sChargeNumber, "000000000000000000000", 21);	//付费号码

		}

		else if (msg.sFeeType == 3)								//如果是包月普通下行信息
		{
				Submit.body.nMorelatetoMTFlag = 2;				//引起MT消息的原因
				Submit.body.nFeeType = 1;						//计费用户类型
				Submit.body.nReportFlag = 0;					//该条消息出错时返回状态报告
				strcpy(msg.sFeeCode, "000000");
		}
		else
		{
			Submit.body.nMorelatetoMTFlag = 0;					//引起MT消息的原因
			Submit.body.nFeeType = msg.sFeeType;				//计费用户类型
			Submit.body.nReportFlag = 0;						//该条消息出错时返回状态报告
		}

		memset(Submit.body.sFeeValue, 0, 6);
		itoa(atoi(msg.sFeeCode), msg.sFeeCode, 10);				//去掉前面的000
		memcpy(Submit.body.sFeeValue, msg.sFeeCode, strlen(msg.sFeeCode));			//资费代码

		memset(Submit.body.sGivenValue, 0, 6);
		memcpy(Submit.body.sGivenValue, "0", 1);				//赠送用户的话费
		Submit.body.nAgentFlag = 0;								//代收费标志,0:应收;1:实收
		Submit.body.nPriority = 9;								//信息级别
		memset(Submit.body.sExpireTime, 0, 16);					//短消息寿命的终止时间
		memset(Submit.body.sScheduleTime, 0, 16);				//短消息定时发送的时间
		Submit.body.nTP_pid = 0;								//测试用
		Submit.body.nTP_udhi = 0;								//测试用
		Submit.body.nMessageCoding = msg.sMsgFmt;				//短消息的编码格式
		Submit.body.nMessageType = 0;							//信息格式
		Submit.body.nMessageLen = htonl(strlen(msg.sMsg));		//短消息的长度

		char *pBuf = NULL;
		pBuf = new char[sizeof(Submit) + strlen(msg.sMsg) + 8];
		memcpy(pBuf, &Submit, sizeof(Submit));
		memcpy(pBuf + sizeof(Submit), msg.sMsg, strlen(msg.sMsg));			//信息内容
		memcpy(pBuf + sizeof(Submit) + strlen(msg.sMsg), msg.sLinkID, 8);	//LINKID

		csSubmitNum.Lock();
		short nNum = nSubmitNum;
		csSubmitNum.Unlock();
		while (nNum >= maxwindow)	//如果发送SUBMIT而没有应答的数量大于最大滑动窗口,则挂起100MS返回
		{
			Sleep(100);
			csSubmitNum.Lock();
			nNum = nSubmitNum;
			csSubmitNum.Unlock();
			continue;
		}

		//发送SUBMIT消息

		//添加到MTUnsendQueue队列
		CTime t = CTime::GetCurrentTime();
		CString time = t.Format("%y%m%d%H%M%S");
		strcpy(msg.sDatetime, time);

		msg.nSendCount ++;
		csMTUsend.Lock();
		MTUnsendQueue.push_back(msg);
		csMTUsend.Unlock();
		//删除MTQueue队列头
		csMT.Lock();
		MTQueue.pop_front();
		csMT.Unlock();

		int	nResult = send(mtsocket, pBuf, sizeof(Submit) + strlen(msg.sMsg) + 8, 0);
		if (SOCKET_ERROR == nResult || 0 == nResult)
		{
			if (pBuf != NULL)
			{
				delete[] pBuf;
				pBuf = NULL;
			}
			Write2RichEditAndLog("发送SUBMIT消息时MT和短信网关的连接已经断开");
			csSubmitNum.Lock();
			nSubmitNum = 0;
			csSubmitNum.Unlock();

			CloseSocket(mtsocket);
			IsMTConnected = FALSE;

			//////////////////////////连接ISMG////////////////////////////
			nResult = FALSE;
			while (!nResult)
			{
				Sleep(2000);
				nResult = SGIPMTConnectISMG();		
			}
			int nStep = 0;
			while (!IsMTConnected)
			{
				Sleep(10);
				nStep += 1;
				if(nStep > 200)	//如果等待IsMTConnected超时,则关闭连接并继续
				{
					CloseSocket(mtsocket);
					break;
				}
			}
			continue;
		}


		if (pBuf != NULL)
		{
			delete[] pBuf;
			pBuf = NULL;
		}
		csSubmitNum.Lock();
		nSubmitNum ++;
		csSubmitNum.Unlock();

		Sleep(msgsendinterval);//休眠msgsendinterval毫秒

	}

	CoUninitialize();
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////
//                                   CMPPMTRec线程函数                                        //
////////////////////////////////////////////////////////////////////////////////////////////////
UINT CMPPMTRecThread(LPVOID pParam)
{
	using namespace CMPP;
	CoInitialize(NULL);
	MessageHeader header;
	char Body[512];
	int nResult;
	UINT nCmdID, nSeqID, nTotalLen;
	_ConnectionPtr pCon1 = NULL;
	/////////////////////////////连接数据库//////////////////////////////////////
	csConfig.Lock();
	CString strCon = "Provider=SQLOLEDB; Server=";
	strCon = strCon + g_config.DBServer;
	strCon = strCon + "; Database=";
	strCon = strCon + g_config.Database;
	strCon = strCon + "; uid=";
	strCon = strCon + g_config.DBUser;
	strCon = strCon + "; pwd=";
	strCon = strCon + g_config.DBPwd;
	csConfig.Unlock();
	try
	{
		pCon1 = NULL;
		HRESULT hr = pCon1.CreateInstance(__uuidof(Connection));
		if(FAILED(hr))
		{
			::MessageBox(NULL,"连接数据库失败","连接数据库失败",MB_OK | MB_ICONWARNING);
			return TRUE;
		}
		pCon1->Open(strCon.AllocSysString(),"", "", adConnectUnspecified);
	}
	catch (_com_error &e) 
	{
		::MessageBox(NULL,e.Description(),"连接数据库失败",MB_OK | MB_ICONWARNING);
	}	

	while (1)
	{
		memset(&header, 0, 12);
		nResult = recv(mtsocket, (char*)&header, 12, 0);
		if (nResult == 0 || nResult == SOCKET_ERROR)
		{
			csSubmitNum.Lock();
			nSubmitNum = 0;
			csSubmitNum.Unlock();

			Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开1");
			CloseSocket(mtsocket);
			IsMTConnected = FALSE;
			pMTRecThread->SuspendThread();
			continue;
		}

		nSeqID = header.nSequenceID;
		nCmdID = ntohl(header.nCommandID);
		nTotalLen = ntohl(header.nTotalLen);

		nResult = recv(mtsocket, Body, nTotalLen - 12, 0);
		if (nResult == 0 || nResult == SOCKET_ERROR)
		{
			csSubmitNum.Lock();
			nSubmitNum = 0;
			csSubmitNum.Unlock();

			Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开2");
			CloseSocket(mtsocket);
			IsMTConnected = FALSE;
			pMTRecThread->SuspendThread();
			continue;
		}
		switch (nCmdID)
		{

		case CMPP_CONNECT_RESP:
			Write2RichEditAndLog("MT收到CMPP_CONNECT_RESP");

			struct tagCONNECTREP
			{
				SConnectResp body;
			}CONNECTRESP;

			memcpy(&CONNECTRESP, Body, sizeof(CONNECTRESP));

			if (CONNECTRESP.body.ucStatus != 0)
			{
				IsMTConnected = FALSE;
				CString err;
				err.Format("%u",CONNECTRESP.body.ucStatus);
				err = "MT连接返回消息报错,错误代码是:" + err;
				Write2RichEditAndLog(err);
			}
			else
			{
				Write2RichEditAndLog("MT连接登录短信网关成功!");
				Write2RichEditAndLog("MTGREEN");
				IsMTConnected = TRUE;
			}
			break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -