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

📄 platformdlg.cpp

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

		case CMPP_TERMINATE_RESP:
			Write2RichEditAndLog("MT收到CMPP_TERMINATE_RESP");
			break;

		case CMPP_TERMINATE:
			Write2RichEditAndLog("MT收到CMPP_TERMINATE");
			MessageHeader sendhead;
			sendhead.nCommandID = htonl(CMPP_TERMINATE_RESP);
			sendhead.nSequenceID = nSeqID;
			sendhead.nTotalLen = htonl(sizeof(MessageHeader));
			nResult = send(mtsocket, (char*)&sendhead,sizeof(MessageHeader), 0);

			if (SOCKET_ERROR == nResult || 0 == nResult)
			{
				CString err;
				err = "MT发送CMPP_TERMINATE_RESP消息时连接已断开";
				Write2RichEditAndLog(err);
				csSubmitNum.Lock();
				nSubmitNum = 0;
				csSubmitNum.Unlock();
			}
			CloseSocket(mtsocket);
			IsMTConnected = FALSE;			
			break;

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

			struct tagSUBMITREP
			{
				SSubmitResp body;
			}SUBMITRESP;

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

			{
				CMessage msg;

				//////////////////////删除MTUNSENDQUEUE队列中已经得到回复的消息////////////////////////////////////
				csMTUsend.Lock();
				if (MTUnsendQueue.size() != 0)
				{
					deque<CMessage> ::iterator it = MTUnsendQueue.begin();

					int index = 0;
					while (it != MTUnsendQueue.end())
					{
						if (it->nRecID == ntohl(header.nSequenceID))
						{
							it->nMsgID = SUBMITRESP.body.sMsgId;
							msg = *it;
							if (msg.sFeeType != 10)		//如果不是包月话单的话,则删除这个MSG;如果是包月话单,则在收到状态报告并正确后删除
							{
								MTUnsendQueue.erase(it);
							}
							break;

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

				//////////////////////删除MTQUEUE队列中已经得到回复的消息////////////////////////////////////
				csMT.Lock();
				if (MTQueue.size() != 0)
				{
					deque<CMessage> ::iterator it = MTQueue.begin();

					int index = 0;
					while (it != MTQueue.end())
					{
						if (it->nRecID == ntohl(header.nSequenceID))
						{
							it->nMsgID = SUBMITRESP.body.sMsgId;
							msg = *it;
							if (msg.sFeeType != 10)		//如果不是包月话单的话,则删除这个MSG;如果是包月话单,则在收到状态报告并正确后删除
							{
								MTQueue.erase(it);
							}
							break;

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

				if (msg.nRecID == 0)
					break;

				if (SUBMITRESP.body.ucResult != 0)//发送失败
				{
					CString err;
					err.Format("返回CMPP_SUBMIT_RESP消息报错,Result代码是:%d,序列号是:%d",SUBMITRESP.body.ucResult, ntohl(nSeqID));
					Write2RichEditAndLog(err);

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

						pCmd.CreateInstance(__uuidof(Command));
						pCmd->ActiveConnection = pCon1;
						pCmd->CommandText = _bstr_t("insert_MTFailsend");
						pCmd->CommandType = adCmdStoredProc;

						param = pCmd->CreateParameter(_bstr_t("RecID"), adBSTR, adParamInput, 21, _variant_t(msg.nRecID)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _variant_t(msg.sMobileNum)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("fee_type"), adTinyInt, adParamInput, 1, _variant_t(msg.sFeeType)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("fee_code"), adBSTR, adParamInput, 6, _variant_t(msg.sFeeCode)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msg"), adBSTR, adParamInput, 160, _variant_t(msg.sMsg)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("time"), adBSTR, adParamInput, 50, _variant_t(msg.sDatetime)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("srcmobile"), adBSTR, adParamInput, 21, _variant_t(msg.sSrcMobile)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("serviceID"), adBSTR, adParamInput, 10, _variant_t(msg.sServiceID)); //业务代码
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(msg.sMsgFmt)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("chargenumber"), adBSTR, adParamInput, 21, _variant_t(msg.sChargeNumber)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("sendcount"), adSmallInt, adParamInput, 2, _variant_t(msg.nSendCount)); 
						pCmd->Parameters->Append(param);
						pCmd->Execute(NULL, NULL, adCmdStoredProc);
						CString str;
						str.Format("%u号消息发送失败,已存储到MTFailsend表中", msg.nRecID);
						Write2RichEditAndLog(str);
					}
					catch (_com_error &e)
					{
						TRACE1("执行insert_MTailsend错误,错误代码:%s/n", (char*)e.Description());
						CString err = (char*)e.Description();
						err = "执行insert_MTailsend错误,错误代码:" + err;
						Write2RichEditAndLog(err);

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

						pCmd->ActiveConnection = pCon1;

						char MsgID[21];
						sprintf(MsgID, "%I64u", SUBMITRESP.body.sMsgId);
						MsgID[20] = 0;
						param = pCmd->CreateParameter(_bstr_t("recID"), adInteger, adParamInput, 4, _variant_t((long)msg.nRecID)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _bstr_t(msg.sMobileNum)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("fee_type"), adTinyInt, adParamInput, 1, _variant_t(msg.sFeeType)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("fee_code"), adBSTR, adParamInput, 6, _bstr_t(msg.sFeeCode)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msg"), adBSTR, adParamInput, 160, _bstr_t(msg.sMsg)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("time"), adBSTR, adParamInput, 50, _bstr_t(msg.sDatetime)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("srcmobile"), adBSTR, adParamInput, 21, _bstr_t(msg.sSrcMobile)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("serviceID"), adBSTR, adParamInput, 10, _bstr_t(msg.sServiceID)); //业务代码
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(msg.sMsgFmt)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("chargenumber"), adBSTR, adParamInput, 21, _bstr_t(msg.sChargeNumber)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("MsgID"), adBSTR, adParamInput, 50, _bstr_t(MsgID)); 
						pCmd->Parameters->Append(param);

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

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

						CString str;
						str.Format("%u号消息发送短信网关成功!目标:%s,消息内容:%s", msg.nRecID, msg.sMobileNum, msg.sMsg);
						Write2RichEditAndLog(str);

						param.Detach()->Release();
						pCmd.Detach()->Release();

					}
					catch(_com_error &e)
					{
						CString err = (char*)e.Description();
						err = "执行存储过程insert_MTSended错误,错误代码:" + err;
						Write2RichEditAndLog(err);
						err.Format("SUBMIRT_RESP SequenceID:%u, msg.nRecID:%u", ntohl(header.nSequenceID), msg.nRecID);
						Write2RichEditAndLog(err);
						param.Detach()->Release();
						pCmd.Detach()->Release();
					}
				}
			}
			
			break;

			case CMPP_QUERY_RESP:
				break;

			case CMPP_CANCEL_RESP:
				break;

			case CMPP_ACTIVE_TEST_RESP:
				//			Write2RichEditAndLog("收到CMPP_ACTIVE_TEST_RESP");
				break;

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

				struct tagACTIVETESTRESP{
					MessageHeader head;
					SActiveTestResp body;
				}ACTIVETESTRESP;

				ACTIVETESTRESP.head.nCommandID = htonl(CMPP_ACTIVE_TEST_RESP);
				ACTIVETESTRESP.head.nSequenceID = nSeqID;
				ACTIVETESTRESP.head.nTotalLen = htonl(sizeof(ACTIVETESTRESP));
				ACTIVETESTRESP.body.cSuccId = 0;

				nResult = send(mtsocket, (char*)&ACTIVETESTRESP,sizeof(ACTIVETESTRESP), 0);
				if (SOCKET_ERROR == nResult || 0 == nResult)
				{
					Write2RichEditAndLog("发送ACTIVE_TEST_RESP时和短信网关的连接已断开");
					CloseSocket(mtsocket);
					csSubmitNum.Lock();
					nSubmitNum = 0;
					csSubmitNum.Unlock();
					IsMTConnected = FALSE;
				}
				break;

			case CMPP_DELIVER:

				char *pBuf = new char[nTotalLen - sizeof(MessageHeader)];
				memcpy(pBuf, Body, nTotalLen - sizeof(MessageHeader));			

				char	sMsgID[9];
				char	sDestID[22];
				char	sServiceID[11];
				u_char	ucTpPid;
				u_char	ucTpUdhi;
				u_char	ucMsgFmt;
				char	sSrcterminalID[22];
				u_char	ucRegister;
				u_char	ucMsgLen;


				memcpy(sMsgID, pBuf, 8);
				memcpy(sDestID, pBuf + 8, 21);
				memcpy(sServiceID, pBuf + 8 + 21, 10);
				memcpy(&ucTpPid, pBuf + 8 + 21 + 10, 1);
				memcpy(&ucTpUdhi, pBuf + 8 + 21 + 10 + 1, 1);
				memcpy(&ucMsgFmt, pBuf + 8 + 21 + 10 + 1 + 1, 1);
				memcpy(sSrcterminalID, pBuf + 8 + 21 + 10 + 1 + 1 + 1, 21);
				memcpy(&ucRegister, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21, 1);
				memcpy(&ucMsgLen, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21 + 1, 1);
				char	*pMessageContent = new char[ucMsgLen];
				memcpy(pMessageContent, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21 + 1 + 1, ucMsgLen);

				delete []pBuf;

				///////////////////////////////////向网关回复消息/////////////////////////////////
				struct tagDELIVERRESP
				{
					MessageHeader head;
					SDeliverResp body;
				}DELIVERRESP;

				DELIVERRESP.head.nCommandID = htonl(CMPP_DELIVER_RESP);
				DELIVERRESP.head.nSequenceID = nSeqID;
				DELIVERRESP.head.nTotalLen = htonl(sizeof(DELIVERRESP));
				memcpy(DELIVERRESP.body.sMsgId, sMsgID, 8);
				DELIVERRESP.body.ucResult = 0;

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

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

					CloseSocket(mtsocket);

					IsMTConnected = FALSE;
					continue;
				}
				//////////////////////////////////结束向网关回复消息////////////////////////////////

				//////////////////////////将UCS2转换成GBK/////////////////////////
				char pDestMsg[160];
				if (ucMsgFmt == 8)
				{
					UCS2ToGB(pMessageContent, ucMsgLen, pDestMsg);
					ucMsgFmt = 15;
				}
				else 
				{	
					memcpy(pDestMsg, pMessageContent, ucMsgLen);
					pDestMsg[ucMsgLen] = 0;
				}
				delete []pMessageContent;


				//////////////////////////如果是CMCCTEST//////////////////////////
/*				CString test(pDestMsg);
				test.MakeUpper();
				test.Trim();
				if (test == "CMCCTEST")
				{
					CString msg;
					CTime t = CTime::GetCurrentTime();
					csConfig.Lock();
					msg.Format("北京,太力信通,%s,%s,%d月 %d日 %d时 %d分", g_config.ServiceID, g_config.SPID, t.GetMonth(),
						t.GetDay(),t.GetHour(),t.GetMinute());
					csConfig.Unlock();

					_CommandPtr pCmd = NULL;
					_ParameterPtr param = NULL;
					try
					{
						pCmd.CreateInstance(__uuidof(Command));


						pCmd->ActiveConnection = pCon1;

						param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _variant_t(sSrcterminalID)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("feetype"), adTinyInt, adParamInput, 1, _variant_t((byte)2)); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("feecode"), adChar, adParamInput, 6, _variant_t(_bstr_t("000001"))); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msg"), adChar, adParamInput, 160, _variant_t(msg)); 
						pCmd->Parameters->Append(param);
						csConfig.Lock();
						param = pCmd->CreateParameter(_bstr_t("srcmobile"), adChar, adParamInput, 21, _variant_t(g_config.ServiceID.AllocSysString())); 
						pCmd->Parameters->Append(param);
						csConfig.Unlock();
						param = pCmd->CreateParameter(_bstr_t("serviceID"), adChar, adParamInput, 10, _variant_t("CMCCTEST")); //业务代码
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(byte(15))); 
						pCmd->Parameters->Append(param);
						param = pCmd->CreateParameter(_bstr_t("chargenumber"), adChar, adParamInput, 21, _variant_t(sSrcterminalID)); 
						pCmd->Parameters->Append(param);

						pCmd->CommandText = _bstr_t("insert_MTQueue");
						pCmd->CommandType = adCmdStoredProc;
						pCmd->Execute(NULL, NULL, adCmdStoredProc);	

						param.Detach()->Release();
						pCmd.Detach()->Release();
					}
					catch(_com_error &e)
					{
						Write2RichEditAndLog(e.ErrorMessage());
						param.Detach()->Release();
						pCmd.Detach()->Release();
					}	
					break;

				}
*/				//////////////////////////结束如果是CMCCTEST////////////////////////

				if (ucRegister == 0)  //此消息非状态报告
				{
					CMessage msg(0,
						sDestID,
						"",
						pDestMsg,
						0,
						"",
						"",
						sSrcterminalID,
						sServiceID,
						ucMsgFmt,
						"");
					CString str;
					str.Format("收到DELIVER,发自:%s,内容:%s", sSrcterminalID, pDestMsg);
					Write2RichEditAndLog(str);
					/////////////////////////////执行insert_MODeliver存储过程////////////////////////////
					_CommandPtr pCmd = NULL;
					_ParameterPtr param = NULL;
					try
					{

⌨️ 快捷键说明

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