📄 mtthread.cpp
字号:
);
try{
m_QueueInfoPtr.CreateInstance(__uuidof(MSMQQueueInfo));
m_ReportMessage.CreateInstance(__uuidof(MSMQMessage));
m_QueueInfoPtr->PutFormatName(_bstr_t(m_OutQueuePath)); //初始化出消息队列
m_QueuePtr=m_QueueInfoPtr->Open(MQ_RECEIVE_ACCESS,MQ_DENY_NONE);
if(m_QueuePtr==NULL)
{
CString ErrorInfo;
ErrorInfo.Format("Create MSMQQueue Object Error:%s",m_OutQueuePath);
ReportError(ErrorInfo);
}
m_QueueInfoPtr->PutFormatName(_bstr_t(m_ReportQueuePath));
m_ReportQueuePtr=m_QueueInfoPtr->Open(MQ_SEND_ACCESS,MQ_DENY_NONE); //初始化状态报告队列
if(m_ReportQueuePtr==NULL)
{
CString ErrorInfo;
ErrorInfo.Format("Init ReportQueue Object Error:%s",m_ReportQueuePath);
ReportError(ErrorInfo);
}
CString Info;
Info.Format("Init mt queue succ");
ReportError(Info);
}
catch(_com_error& e)
{
CMsmqerr errtemp;
CString ErrorInfo;
ErrorInfo.Format("Init MT queue error:%s",errtemp.GetErrText(e));
ErrorInfo+=",mt path:";
ErrorInfo+=m_OutQueuePath;
ReportError(ErrorInfo);
return FALSE;
}
return TRUE;
}
//初始化CmppConnect参数
void CMtThread::InitConnectParam(CString &RemoteIP, UINT &RemotePort, CString &ICPID, CString& SourceNode,CString &UserName, CString &Password, CString &ServiceNumber,int BeginSequenceNum)
{
m_csRemoteIP=RemoteIP;
m_csICPID=ICPID;
m_csSourceNode=SourceNode;
m_RemotePort=RemotePort;
m_csServicenumber=ServiceNumber;
m_csPassword=Password;
m_csUserName=UserName;
m_BeginSequence=BeginSequenceNum;
m_SequenceID=m_BeginSequence;
}
void CMtThread::ReportNormalInfo(CString MsgType, CString ChildType, CString Content)
{
m_pParentAction->SaveStatusInfo(MsgType,ChildType,Content,m_ProvinceIndex );
}
//连接
BOOL CMtThread::Connect()
{
CString csTemp;
if(!m_pMtSocket->CreateSocket(0))
{
csTemp.Format("无法创建套接字");
ReportError(csTemp);
return FALSE;
}
//连接
if(!m_pMtSocket->Bind(m_csRemoteIP ,m_RemotePort,m_csICPID,m_csSourceNode,m_csUserName,m_csPassword))
{
csTemp.Format("无法BIND远程服务");
ReportError(csTemp);
return FALSE;
}
return TRUE;
}
//断开连接
void CMtThread::DisConnect()
{
KillThreadTimer(m_EventKeepActive);
if(m_pMtSocket!=NULL)
{
m_pMtSocket->SendTerminate();
m_EventNotReceiveTerminalRsp=SetThreadTimer(WAITTERMITERRSP);
}
}
CString CMtThread::GetSubString(CString csIn, int iWhich)
{
int t;
if (iWhich<0) return "";
for(int i=0;i<iWhich;i++)
{
t=csIn.Find('_');
if (csIn.Find('_')==-1)
return "";
csIn=csIn.Right(csIn.GetLength()-t-1);
}
t=csIn.Find('_');
if(t==-1)
{
return csIn;
}
else
{
csIn=csIn.Left(t);
}
return csIn;
}
//发送普通文本
BOOL CMtThread::Send(CString &SendType,LPCTSTR FromPhone, LPCTSTR ReceivePhone, LPCTSTR ChargePhone, LPCTSTR IcpID, LPCTSTR ServiceType, LPCTSTR FeeType, LPCTSTR FeeValue, LPCTSTR MessageContent,int& MsgFmt,LPCTSTR LinkID,LPCTSTR MoToMtFlag, LPCTSTR RegistDeliver)
{
if(m_pMtSocket==NULL)
return FALSE;
CString csTrueValue="000000";
CString csFeeValue=FeeValue;
int i,FeeLen=csFeeValue.GetLength();
if(FeeLen<6)
{
for(i=0;i<FeeLen;i++)
{
csTrueValue.SetAt(6-FeeLen+i,csFeeValue.GetAt(i));
}
}
else
csTrueValue=csFeeValue.Left(6);
BOOL bSucc = TRUE;
if (SendType == "30") //群发
{
bSucc = m_pMtSocket->SgipMultiSubmit(FromPhone,ReceivePhone,ChargePhone,FeeType,csTrueValue,MessageContent,ServiceType,m_csICPID,MsgFmt,MoToMtFlag,RegistDeliver);
}
else
bSucc = m_pMtSocket->SgipSubmit(FromPhone,ReceivePhone,ChargePhone,FeeType,csTrueValue,MessageContent,ServiceType,m_csICPID,MsgFmt,LinkID,MoToMtFlag,RegistDeliver);
return bSucc;
}
//发送二进值消息
BOOL CMtThread::SendBinary(LPCTSTR FromPhone, LPCTSTR ReceivePhone, LPCTSTR ChargePhone, LPCTSTR IcpID, LPCTSTR ServiceType, LPCTSTR FeeType, LPCTSTR FeeValue, BYTE* BinaryBuf,int BinaryLen,int& MsgFmt,int &Tppid,int &Tpudhi,LPCTSTR LinkID)
{
BOOL bSuccess=TRUE;
if(m_pMtSocket==NULL)
return FALSE;
CString csTrueValue="000000";
CString csFeeValue=FeeValue;
int i,FeeLen=csFeeValue.GetLength();
if(FeeLen<6)
{
for(i=0;i<FeeLen;i++)
{
csTrueValue.SetAt(6-FeeLen+i,csFeeValue.GetAt(i));
}
}
else
csTrueValue=csFeeValue.Left(6);
bSuccess=m_pMtSocket->SgipSendBinary(FromPhone,ReceivePhone,ChargePhone,0,FeeType,csTrueValue,
BinaryBuf,BinaryLen,ServiceType,m_csICPID,MsgFmt,Tppid,Tpudhi,LinkID);
return bSuccess;
}
//下发消息的状态
/*
各值为
Status=1 表示收到LogRsp,Result为返回结果
Status=2 表示收到SubmitResp, Result为返回结果 ,在此使用MsgID
status=3 表示收到TerminateRsp, Result为返回结果
*/
BOOL CMtThread::OnSubmitStatus(int Status,unsigned char Result,char* MsgID)
{
CString csDisplayInfo;
switch(Status)
{
case 1: //收到LoginRsp
m_ConnectStatus=1;//连接正常
KillThreadTimer(m_EventNotReceiveConnectRsp);
csDisplayInfo.Format("Receive ConnectResponse Result:%d!",Result);
m_MsgType="00";
m_ChildType="01";
m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csDisplayInfo,m_ProvinceIndex);
//先判断是否是重发,如果是,重发次数加一
if(m_ReSend==TRUE && m_ResendTimes<3)//重发上一条包
{
m_ResendTimes++; //只重发3次
}
else if(m_ReSend==TRUE)
{
m_ResendTimes=0;
m_ReSend=FALSE;
SaveWrongPackage();//保存错包到日志文件
DisConnect();
m_bBeginReadQueue=TRUE;//重发失败开始读下一个包
return FALSE;
}
//发送
if(m_SendPackage.m_Contype==3)//说明要发送SMC话单
{
SubmitSMCMoney(m_SendPackage.m_csDestPhone,m_SendPackage.m_csContent,m_SendPackage.m_csFeePhone,m_SendPackage.m_csFeetype,
m_SendPackage.m_csFeeCode ,m_SendPackage.m_csServiceType);
CString csTemp;
csTemp.Format("Send SMC OK:%s:%s:%s",m_SendPackage.m_csDestPhone,m_SendPackage.m_csServiceType,m_SendPackage.m_csFeeCode);
m_MsgType="00";
m_ChildType="03";
m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csTemp,m_ProvinceIndex);
m_EventNotReceiveSubmitRsp=SetThreadTimer(WAITSUBMITRSP);
break;
}
else if(m_SendPackage.m_Contype==4)//发送赠送话单
{
SubmitGivenMoney(m_SendPackage.m_csDestPhone,m_SendPackage.m_csContent,m_SendPackage.m_csFeePhone,m_SendPackage.m_csFeetype,
m_SendPackage.m_csFeeCode ,m_SendPackage.m_csServiceType,m_SendPackage.m_GivenValue);
CString csTemp;
csTemp.Format("Send GivenMoney OK:%s:%s:%s:%s",m_SendPackage.m_csDestPhone,m_SendPackage.m_csServiceType,m_SendPackage.m_GivenValue,m_SendPackage.m_csContent);
m_MsgType="00";
m_ChildType="03";
m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csTemp,m_ProvinceIndex);
m_EventNotReceiveSubmitRsp=SetThreadTimer(WAITSUBMITRSP);
break;
}
else if(SubmitShortMessage())//发送成功
{
KillThreadTimer(m_EventKeepActive);
KillThreadTimer(m_EventNotReceiveTerminalRsp);
m_EventNotReceiveSubmitRsp=SetThreadTimer(WAITSUBMITRSP);
}
else //失败
{
CString csError;
csError="Submit Fail! Reconnect!";
ReportError(csError);
Reconnect();
return FALSE;
}
break;
case 2:
{
if(Result!=0)//发送失败,重发3次
{
CString csErrorInfo;
csErrorInfo.Format("RECEIVE SubmitRsp Result is not 0 is %d!Begin ReSubmit!",Result);
ReportError(csErrorInfo);
m_ReSend=TRUE;//重发
Reconnect();//自动重连
return FALSE;
}
__int64 iMsgID=0;
memcpy(&iMsgID,MsgID+4,8);
char Temp[20];
_i64toa(iMsgID,Temp,16);
if(m_SendPackage.m_SendLength<=140 || m_SendPackage.m_csSendType=="30")
{
KillThreadTimer(m_EventNotReceiveSubmitRsp);
csDisplayInfo.Format("Receive SubmitResponse--MsgID:%s--Result:%d",Temp,Result);
m_MsgType="00";
m_ChildType="02";
m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csDisplayInfo,m_ProvinceIndex);
m_SubmitMsgs++;//已发送的消息数加一
}
else
{
if(m_SendPackage.m_PkNumber==2)
KillThreadTimer(m_EventNotReceiveSubmitRsp);
else
KillThreadTimer(m_WaitLongSubmitRsp);
csDisplayInfo.Format("Receive %d/%d Long SubmitResponse--MsgID:%s--Result:%d",m_SendPackage.m_PkNumber-1,m_SendPackage.m_PkTotal,Temp,Result);
m_MsgType="00";
m_ChildType="02";
m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csDisplayInfo,m_ProvinceIndex);
m_SubmitMsgs++;//已发送的消息数加一
if(m_SendPackage.m_PkNumber<=m_SendPackage.m_PkTotal)//已发完
SubmitLongBinary();
}
//发送成功完毕断开连接,若有多条短信连续发送,则不必断开连接
if(m_SendPackage.m_SendLength<=140
|| m_SendPackage.m_csSendType =="30" ||m_SendPackage.m_PkNumber>m_SendPackage.m_PkTotal)
{
m_bBeginReadQueue=TRUE;
m_EventKeepActive=SetThreadTimer(KEEPACTIVE);
}
//写入状态报告队列
CString csLabel;
if(m_SendPackage.m_csFeePhone=="")
m_SendPackage.m_csFeePhone=m_SendPackage.m_csDestPhone;
if(m_SendPackage.m_Contype==3)//说明是SMC话单,生成话单的Label
{
csLabel.Format("01_%s_%s_%s_%s_%s_%s_%s_%s",m_Province,m_SendPackage.m_csDestPhone,m_SendPackage.m_csServiceType,
m_SendPackage.m_csFeetype,m_SendPackage.m_csFeeCode,m_SendPackage.m_csFeePhone,m_SendPackage.m_csGameID,Temp);
}
else
{
csLabel.Format("00_%s_%s_%s_%s_%s_%s_%s_%s_%s_no",m_Province,m_SendPackage.m_csDestPhone,m_SendPackage.m_csServiceType,
m_SendPackage.m_csFeetype,m_SendPackage.m_csFeeCode,m_SendPackage.m_csFeePhone,m_SendPackage.m_csGameID,Temp,m_SendPackage.m_csChildNum);
}
try{
m_ReportMessage->Label=_bstr_t(csLabel);
m_ReportMessage->Body=_variant_t(m_SendPackage.m_csContent);
m_ReportMessage->Send(m_ReportQueuePtr);
}
catch(_com_error& e)
{
CMsmqerr errtemp;
CString ErrorInfo;
ErrorInfo.Format("Write SubmitResponse to Report queue error:%s",errtemp.GetErrText(e));
ReportError(ErrorInfo);
}
return FALSE;
break;
}
case 3:
{
CString MsgInfo;
MsgInfo.Format("Receive UnBindResp,close connection with smg!");
KillThreadTimer(m_EventNotReceiveTerminalRsp);
KillThreadTimer(m_EventKeepActive);
ReportError(MsgInfo);
DeleteSocket();
if(!m_ReSend)
{
m_ConnectStatus=0;
m_bBeginReadQueue=TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -