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

📄 platformdlg.cpp

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

						pCmd.CreateInstance(__uuidof(Command));
						pCmd->ActiveConnection = pCon1;

						param = pCmd->CreateParameter(_bstr_t("srcmobile"), adVarChar, adParamInput, 50, _bstr_t(sSrcterminalID)); 
						pCmd->Parameters->Append(param);

						param = pCmd->CreateParameter(_bstr_t("msg"), adVarChar, adParamInput, 160, _variant_t(pDestMsg)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(ucMsgFmt)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("spnumber"), adVarChar, adParamInput, 50, _variant_t(sDestID)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("linkID"), adVarChar, adParamInput, 50, _variant_t("")); 
						pCmd->Parameters->Append(param);

						pCmd->CommandText = _bstr_t("insert_MODeliver");
						pCmd->CommandType = adCmdStoredProc;

						pCmd->Execute(NULL, NULL, adCmdStoredProc);

						param.Detach()->Release();
						pCmd.Detach()->Release();
					}
					catch(_com_error &e)
					{
						CString err = (char*)e.Description();
						err = "执行存储过程insert_MODeliver失败,错误代码:" + err;
						Write2RichEditAndLog(err);
						param.Detach()->Release();
						pCmd.Detach()->Release();
					}			

					csMO.Lock();
					MOQueue.push_back(msg);
					csMO.Unlock();
				}
				else   //此消息是状态报告
				{
					SReport report;
					memcpy(&report, pDestMsg, sizeof(SReport));

					char stat[8];
					memcpy(stat, report.sStat, 7);
					stat[7] = 0;

					//////////////////////删除MTUNSENDQUEUE队列中已经得到状态报告的包月话单信息////////////////////////////////////
					csMTUsend.Lock();
					if (MTUnsendQueue.size() != 0)
					{
						deque<CMessage> ::iterator it = MTUnsendQueue.begin();

						while (it != MTUnsendQueue.end())
						{
							if (it->nMsgID == report.sMsgId && it->sFeeType == 10 && strcmp(stat, "DELIVRD") == 0)//如果这个MSG的ID和状态报告的一致,并且是包月话单,并且状态返回是DELIVRD
							{
								
								MTUnsendQueue.erase(it);
								CString str;
								str.Format("删除MTUnsendQueue中的%u号包月话单消息", it->nRecID);
								Write2RichEditAndLog(str);
								break;

							}
							else
								it ++;
						}
					}
					csMTUsend.Unlock();

					//////////////////////删除MTQUEUE队列中已经得到状态报告的包月话单信息////////////////////////////////////
					csMT.Lock();
					if (MTQueue.size() != 0)
					{
						deque<CMessage> ::iterator it = MTQueue.begin();

						while (it != MTQueue.end())
						{
							if (it->nMsgID == report.sMsgId && it->sFeeType == 10 && strcmp(stat, "DELIVRD") == 0)//如果这个MSG的ID和状态报告的一致,并且是包月话单,并且状态返回是DELIVRD
							{
								MTQueue.erase(it);
								CString str;
								str.Format("删除MTQUEUE中的%u号包月话单消息", it->nRecID);
								Write2RichEditAndLog(str);
								break;

							}
							else
								it ++;
							
						}
					}
					csMT.Unlock();

					/////////////////////////////执行insert_MTReport存储过程////////////////////////////
					_CommandPtr pCmd = NULL;
					_ParameterPtr param = NULL;
					try
					{

						pCmd.CreateInstance(__uuidof(Command));
						pCmd->ActiveConnection = pCon1;

						char MsgID[21];
						sprintf(MsgID, "%I64u", report.sMsgId);
						MsgID[20] = 0;

						param = pCmd->CreateParameter(_bstr_t("MsgID"), adVarChar, adParamInput, 50, _bstr_t(MsgID)); 
						pCmd->Parameters->Append(param);

						param = pCmd->CreateParameter(_bstr_t("UserNumber"), adVarChar, adParamInput, 50, _variant_t(report.sDstAddr)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("State"), adVarChar, adParamInput, 50, _variant_t(report.sStat)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("DoneTime"), adVarChar, adParamInput, 50, _variant_t(report.sDoneTime)); 
						pCmd->Parameters->Append(param);

						pCmd->CommandText = _bstr_t("insert_MTReport");
						pCmd->CommandType = adCmdStoredProc;

						pCmd->Execute(NULL, NULL, adCmdStoredProc);

						CString err;
						err.Format("收到状态反馈消息,MsgID为%s,返回值是%s", MsgID, stat);
						Write2RichEditAndLog(err);

						param.Detach()->Release();
						pCmd.Detach()->Release();
					}
					catch(_com_error &e)
					{
						CString err = (char*)e.Description();
						err = "执行存储过程insert_MTReport失败,错误代码:" + err;
						Write2RichEditAndLog(err);
						param.Detach()->Release();
						pCmd.Detach()->Release();
						break;
					}			
				}
				break;
		}//end switch
	}// end while
	CoUninitialize();
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////
//                                   SGIPMTRec线程函数                                        //
////////////////////////////////////////////////////////////////////////////////////////////////
UINT SGIPMTRecThread(LPVOID pParam)
{
	using namespace SGIP;
	CoInitialize(NULL);
	_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);
	}	

	MessageHeader head;
	UINT nCmdID, nSeqID[3], nTotalLen;

	while (1)
	{
		memset(&head, 0, 20);
		int nResult = recv(mtsocket, (char*)&head, 20, 0);
		if (nResult == 0 || nResult == SOCKET_ERROR)
		{
			Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开3");
			CloseSocket(mtsocket);
			IsMTConnected = FALSE;

			csSubmitNum.Lock();
			nSubmitNum = 0;
			csSubmitNum.Unlock();

			pMTRecThread->SuspendThread();
			continue;
		}
		nCmdID = ntohl(head.nCommandID);
		nSeqID[0] = head.nSeqNumber[0];
		nSeqID[1] = head.nSeqNumber[1];
		nSeqID[2] = head.nSeqNumber[2];
		nTotalLen = ntohl(head.nTotalLen);

		switch (nCmdID)
		{
		case SGIP_REPORT:
			SReport Reportbody;

			nResult = recv(mtsocket, (char*)&Reportbody, nTotalLen - 20, 0);
			if (nResult == 0 || nResult == SOCKET_ERROR)
			{
				Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关连接已断开4");
				CloseSocket(mtsocket);
				IsMTConnected = FALSE;

				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

				pMTRecThread->SuspendThread();
				continue;
			}

			struct tagREPORTRESP
			{
				MessageHeader head;
				SReportResp body;
			}REPORTRESP;


			if (Reportbody.nReportType == 1)//如果是对先前一条前转Deliver命令的状态报告
			{
				REPORTRESP.head.nCommandID = htonl(SGIP_REPORT_RESP);
				REPORTRESP.head.nSeqNumber[0] = nSeqID[0];
				REPORTRESP.head.nSeqNumber[1] = nSeqID[1];
				REPORTRESP.head.nSeqNumber[2] = nSeqID[2];
				REPORTRESP.head.nTotalLen = htonl(sizeof(REPORTRESP));
				REPORTRESP.body.nResult = 0;
				memset(REPORTRESP.body.sReserve, 0, 8);
			}
			else		//对先前一条Submit命令的状态报告
			{

				/////////////////////////////执行insert_MTReport存储过程////////////////////////////
				_CommandPtr pCmd = NULL;
				_ParameterPtr param = NULL;
				try
				{
					pCmd.CreateInstance(__uuidof(Command));

					pCmd->ActiveConnection = pCon1;

					CString seqID;
					seqID.Format("%u%u%u", ntohl(Reportbody.sSubmitSeqNumber[0]), ntohl(Reportbody.sSubmitSeqNumber[1]), ntohl(Reportbody.sSubmitSeqNumber[2]));
					param = pCmd->CreateParameter(_bstr_t("seqID"), adVarChar, adParamInput, 50, _bstr_t(seqID)); 
					pCmd->Parameters->Append(param);
					param = pCmd->CreateParameter(_bstr_t("UserNumber"), adVarChar, adParamInput, 50, _variant_t(Reportbody.sUserNumber)); 
					pCmd->Parameters->Append(param);
					param = pCmd->CreateParameter(_bstr_t("State"), adUnsignedInt, adParamInput, 1, _variant_t(Reportbody.nState)); 
					pCmd->Parameters->Append(param);
					param = pCmd->CreateParameter(_bstr_t("ErrorCode"), adUnsignedInt, adParamInput, 1, _variant_t(Reportbody.nErrorCode)); 
					pCmd->Parameters->Append(param);

					pCmd->CommandText = _bstr_t("insert_MTReport");
					pCmd->CommandType = adCmdStoredProc;

					pCmd->Execute(NULL, NULL, adCmdStoredProc);
					param.Detach()->Release();
					pCmd.Detach()->Release();
				}				
				catch(_com_error &e)
				{
					CString err = (char*)e.Description();
					err = "执行存储过程insert_MTReport失败,错误代码是:" + err;
					Write2RichEditAndLog(err);
					param.Detach()->Release();
					pCmd.Detach()->Release();
				}
				REPORTRESP.head.nCommandID = htonl(SGIP_REPORT_RESP);
				REPORTRESP.head.nSeqNumber[0] = nSeqID[0];
				REPORTRESP.head.nSeqNumber[1] = nSeqID[1];
				REPORTRESP.head.nSeqNumber[2] = nSeqID[2];
				REPORTRESP.head.nTotalLen = htonl(sizeof(REPORTRESP));
				REPORTRESP.body.nResult = 0;
				memset(REPORTRESP.body.sReserve, 0, 8);

				if (Reportbody.nState != 0)
				{
					CString str;
					str.Format("收到%u号消息发送错误的REPORT信息,State是:%u,ErrorCode是:%u", ntohl(Reportbody.sSubmitSeqNumber[2]), 
						Reportbody.nState, Reportbody.nErrorCode);
					Write2RichEditAndLog(str);
				}
				else
				{
					CString str;
					str.Format("收到%u号消息发送正确的REPORT信息", ntohl(Reportbody.sSubmitSeqNumber[2]));
					Write2RichEditAndLog(str);
				}
			}

			nResult = send(mtsocket, (char*)&REPORTRESP, sizeof(REPORTRESP), 0);
			if (SOCKET_ERROR == nResult || 0 == nResult)
			{
				TRACE1(_T("发送SGIP_REPORT_RESP消息出错,错误代码是:%u \n"), WSAGetLastError());
				CString err;
				err.Format("发送SGIP_REPORT_RESP消息出错,错误代码是:%u", WSAGetLastError());

				Write2RichEditAndLog(err);
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

				CloseSocket(mtsocket);
				IsMTConnected = FALSE;			
			}
			break;

		case SGIP_UNBIND:

			MessageHeader head;
			head.nCommandID = htonl(SGIP_UNBIND_RESP);
			head.nSeqNumber[0] = nSeqID[0];
			head.nSeqNumber[1] = nSeqID[1];
			head.nSeqNumber[2] = nSeqID[2];
			head.nTotalLen = htonl(sizeof(MessageHeader));

			nResult = send(mtsocket, (char*)&head, sizeof(head), 0);
			if (SOCKET_ERROR == nResult || 0 == nResult)
			{
				CString err;
				err.Format("发送SGIP_UNBIND_RESP消息出错,错误代码是:%d", WSAGetLastError());
				Write2RichEditAndLog(err);
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

			}
			CloseSocket(mtsocket);
			IsMTConnected = FALSE;			
			break;

		case SGIP_BIND_RESP:
			SBindResp BindRespbody;

			nResult = recv(mtsocket, (char*)&BindRespbody, nTotalLen - 20, 0);
			if (nResult == 0 || nResult == SOCKET_ERROR)
			{
				Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开5");
				CloseSocket(mtsocket);
				IsMTConnected = FALSE;
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

				pMTRecThread->SuspendThread();

				continue;
			}

			if (BindRespbody.nResult != 0)
			{
				IsMTConnected = FALSE;

				CString err;
				err.Format("MT连接返回错误,错误代码:%d",BindRespbody.nResult);

				Write2RichEditAndLog(err);

			}
			else
			{
				Write2RichEditAndLog("登录短信网关成功!");
				Write2RichEditAndLog("MTGREEN");
				IsMTConnected = TRUE;
			} 
			break;


		case SGIP_SUBMIT_RESP:

			csSubmitNum.Lock();
			if (nSubmitNum > 0)
				nSubmitNum --;
			csSubmitNum.Unlock();

			SSubmitResp SubmitRespbody;

			nResult = recv(mtsocket, (char*)&SubmitRespbody, nTotalLen - 20, 0);
			if (nResult == 0 || nResult == SOCKET_ERROR)
			{
				Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关连接已断开6");

				CloseSocket(mtsocket);
				IsMTConnected = FALSE;
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();

				pMTRecThread->SuspendThread();

				con

⌨️ 快捷键说明

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