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

📄 mtthread.cpp

📁 一个手机通信的源代码 一个手机通信的源代码一个手机通信的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		);
 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 + -