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

📄 recvsend.cpp

📁 中国电信文字短信收发程序。采用电信提供的接口动态库。
💻 CPP
字号:
// RecvSend.cpp: implementation of the CRecvSend class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HHSJ_Msg.h"
#include "RecvSend.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRecvSend::CRecvSend()
{
	
}

CRecvSend::~CRecvSend()
{
	
}
void CRecvSend::MainProcess()
{
	WriteLogFile("SMG线程启动了");
	while(GlobalVar.ThreadContr.IsRecvSendThreadTerm)
	{
		try
		{
			int iCount=0;
			//扫描待发信息表,从而发送数据
			if (0==SendMsg()) iCount++;	
			if (0==RecvMsg()) iCount++;
			if (2==iCount) Sleep(2000);//如果收发都没有数据处理,让线程休息2秒钟
		}catch(...)
		{
			WriteLogFile("发送程序发生异常");
		}
	}
	for(int i=0;i<10;i++)
	{
		int iRet=SMGPDisconnect();//尝试10次----关闭和网关建立的所有连接
		if (iRet == SMGP_API_SUCCESS) break;
		Sleep(100);
	}

	GlobalVar.ThreadContr.IsRecvSendThreadTerm = 1 ; //通知主线程,从线程已经结束了
	WriteLogFile("SMG线程正常结束");
}
int CRecvSend::SendMsg()
{
	int RetValue=0;
	try
	{		
		///////////////////////////////////////////////////////////////
		CString str=_T("");
		str="Select top 100 * from PHS_SEND where Arranged_time<getdate() order by priority desc";//每次最多只处理100条记录
		CRecSet RecSet(GlobalVar.DB.DBSQLServer.pDatabase);
		RecSet.OpenRecordSet(str);
		RetValue=RecSet.RecordCount;
		if (RetValue==0) return RetValue;
		////////////////////////////////////////////////////////////////
		SendToGateWay(&RecSet);
	}
	catch(...)
	{
		WriteLogFile("Exception In SendMsg()");
	}
	return RetValue;
}

void CRecvSend::SendToGateWay(CRecSet *pRecSet)
{
	//for循环逐条处理待发记录
	for(int i=1;i<=pRecSet->RecordCount;i++)
	{
		CString str=_T("");
		
		CString Seq=_T("");
		CString MsgFro=_T("");
		CString MsgTitleCode=_T("");
		CString IS_OPER_CONT=_T("");
		
		Seq=pRecSet->GetFieldValueByName("SEQ",SQL_C_CHAR);
		MsgFro=pRecSet->GetFieldValueByName("MSG_FRO",SQL_C_CHAR);
		MsgTitleCode=pRecSet->GetFieldValueByName("MSG_TITLE_CODE",SQL_C_CHAR);
		IS_OPER_CONT=pRecSet->GetFieldValueByName("IS_OPER_CONT",SQL_C_CHAR);
		
		//////////////////////////////////////////////////
		//公共字段
		CString NeedReport=_T("");
		CString Priority=_T("");
		CString ServerID=_T("");
		CString MsgFormat=_T("");
		CString FeeType=_T("");
		CString FeeCode=_T("");
		CString FixedFee=_T("");
		CString ValidTime=_T("");
		CString AtTime=_T("");
		CString ChargeTermID=_T("");
		CString DestTermID=_T("");
		CString SRC_TERMID=_T("");
		CString MsgLength=_T("");
		CString MsgCont=_T("");
		CString MsgType=_T("");
		char * p;
		//从记录集合提取转移的内容
		NeedReport=pRecSet->GetFieldValueByName("NEED_REPORT",SQL_C_CHAR);
		Priority=pRecSet->GetFieldValueByName("PRIORITY",SQL_C_CHAR);
		ServerID=pRecSet->GetFieldValueByName("SERVER_ID",SQL_C_CHAR);
		MsgFormat=pRecSet->GetFieldValueByName("MSG_FORMAT",SQL_C_CHAR);
		FeeType=pRecSet->GetFieldValueByName("FEE_TYPE",SQL_C_CHAR);
		FeeCode=pRecSet->GetFieldValueByName("FEE_CODE",SQL_C_CHAR);
		FixedFee=pRecSet->GetFieldValueByName("FIXED_FEE",SQL_C_CHAR);
		ValidTime=pRecSet->GetFieldValueByName("VALID_TIME",SQL_C_TIMESTAMP);
		AtTime=pRecSet->GetFieldValueByName("AT_TIME",SQL_C_TIMESTAMP);
		ChargeTermID=pRecSet->GetFieldValueByName("CHARGE_TERMID",SQL_C_CHAR);
		DestTermID=pRecSet->GetFieldValueByName("DEST+TERMID",SQL_C_CHAR);
		SRC_TERMID=pRecSet->GetFieldValueByName("SRC_TERMID",SQL_C_CHAR);
		
		//再次判断长度是否准确
		bool IsLengthRight=true;
		MsgLength=pRecSet->GetFieldValueByName("MSG_LENGTH",SQL_C_CHAR);
		MsgCont=pRecSet->GetFieldValueByName("MSG_CONT",SQL_C_CHAR);
		short len=atoi(MsgLength.GetBuffer(0));
		if(len!=MsgCont.GetLength()) 
		{
			IsLengthRight=false;
			len=MsgCont.GetLength();
			MsgLength.Format("%d",len);
		}
		///////////////////////////////////////////////////////////////////
		MsgType=pRecSet->GetFieldValueByName("MSG_TYPE",SQL_C_CHAR);
		
		///////////////////////////////////////////////////////////////////////
		//往网关发送
		int nErrorCode;
		CString RetMsgID;
		int nReturn = SMGPSendSingle( atoi(NeedReport.GetBuffer(0)),
			atoi(Priority.GetBuffer(0)),
			(LPCSTR)ServerID,
			atoi(MsgFormat.GetBuffer(0)),
			(LPCSTR)FeeType,
			(LPCSTR)FeeCode,
			(LPCSTR)FixedFee,
			(LPCSTR)ValidTime,
			(LPCSTR)AtTime,
			(LPCSTR)ChargeTermID,
			(LPCSTR)DestTermID,
			atoi(MsgLength.GetBuffer(0)),
			(LPCSTR)MsgCont,
			RetMsgID.GetBuffer(0),//注意数据类型,此处可能有错误
			&nErrorCode,
			atoi(MsgType.GetBuffer(0)),
			(LPCSTR)SRC_TERMID);
		//下面2行语句是将字符串转换为日期 以便插入数据库
		ValidTime.Format("cast('%s' as datetime)",ValidTime);
		AtTime.Format("cast('%s' as datetime)",AtTime);
		////////////////////////////////////////////////////
		CString ErrorCode=_T("");
		CString IsSubmitSucc;
		if( nReturn == SMGP_API_SUCCESS )
		{
			IsSubmitSucc="1";
		}
		else
		{
			ErrorCode.Format("%d",nErrorCode);
			IsSubmitSucc="0";
		}
		////////////////////////////////////////////////////////
		//删除该条记录
		//测试期间可以临时暂时注释
		str.Format("delete from PHS_SEND where seq=%s",Seq);
		p=str.GetBuffer(0);
		GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(p);

		str.Format("INSERT INTO PASSMSG (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,\
		Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,SRC_TERMID,Msg_Length,Msg_Cont,\
	    Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,REPORT_SN,IS_SUBMIT_S,F_RSON_SUBMIT)\
		values ('%s','%s','%s','%s','%s','%s',\
		'%s',%s,%s,'%s','%s','%s',%s,'%s','%s','%s','%s','%s','%s','%s','%s')",\
		NeedReport,Priority,ServerID,MsgFormat,FeeType,FeeCode,FixedFee,\
		ValidTime,AtTime,ChargeTermID,DestTermID,SRC_TERMID,MsgLength,\
		MsgCont,MsgType,Seq,MsgFro,MsgTitleCode,RetMsgID,IsSubmitSucc,ErrorCode);
		p=str.GetBuffer(0);
		GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(p);//执行插入语句
																									   
		
		
	/*	if( nReturn == SMGP_API_SUCCESS )
		{//发送成功的处理
			//往已发表写备份
			//if(IS_OPER_CONT=="0")//往普通短信已经发送表写 否则往内容短信已经发送表写
			str="INSERT INTO PASSMSG (Seq,Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
			//else str="INSERT INTO MSG_CONT (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
			str+="Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,SRC_TERMID,Msg_Length,Msg_Cont,";
			str+="Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,REPORT_SN) values (";
			str+=NeedReport+","+Priority+","+ServerID+","+MsgFormat+","+FeeType+","+FeeCode;
			str+=","+FixedFee+","+ValidTime+","+AtTime+","+ChargeTermID+","+DestTermID;
			str+=","+SRC_TERMID+","+MsgLength+","+MsgCont+","+MsgType;
			str+=","+Seq+","+MsgFro+","+MsgTitleCode+","+RetMsgID+")";
			p=str.GetBuffer(0);
			GlobalVar.DB.DBSQLServer .NoRetExecuteSQL(p);//执行插入语句			
		}
		else
		{//发送失败的处理
			CString ErrorCode=_T("");
			ErrorCode.Format("%d",nErrorCode);	
			str="INSERT INTO FailedMsg (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
			str+="Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,Reply_Path,Msg_Length,Msg_Cont,";
			str+="Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,Error_Code,REPORT_SN) values (";
			str+=NeedReport+","+Priority+","+ServerID+","+MsgFormat+","+FeeType+","+FeeCode;
			str+=","+FixedFee+","+ValidTime+","+AtTime+","+ChargeTermID+","+DestTermID;
			str+=","+SRC_TERMID+","+MsgLength+","+MsgCont+","+MsgType;
			str+=","+Seq+","+MsgFro+",";
			str+=MsgTitleCode+","+ErrorCode+","+RetMsgID+")";
			char * p=str.GetBuffer(0);
			GlobalVar.DB.DBSQLServer .NoRetExecuteSQL(p);//执行插入语句
		}*/	

		///////////////////////////////////////////////////////////////////////
		//移动记录指针
		pRecSet->LocateRecord(1);
	}
}

int CRecvSend::RecvMsg()
{
	int iRecvCount=0;
	for(int i=0;i<100;i++)
	{
		DeliverResp DlvrResp;
		if(SMGP_API_SUCCESS==SMGPDeliver(5000,&DlvrResp))
		{
			iRecvCount++;
			WriteToPHS_DELIVER(&DlvrResp);
			continue;
		}
		else
		{
			break;
		}

	}
	return iRecvCount;
}

void CRecvSend::WriteToPHS_DELIVER(DeliverResp* p)
{
	CString strSQL=_T("");
	char * pSQL;
	//先往上行备份表写
	strSQL.Format("insert into PHS_DELIVER_BAK (MSG_ID,MSG_FORMAT,SRC_TERMID,IS_REPORT,MSG_LEN,\
		MSG_CONT,DEST_TERMID,RECV_TIME) values ('%s','%d','%s','%d',%d,'%s','%s',cast('%s' as datetime)",\
		p->SMsgID,p->NMsgFormat,p->SSrcTermID,p->NIsReport,p->NMsgLen,\
		p->sMsgContent,p->sDestTermID,p->sRecvTime);
	pSQL=strSQL.GetBuffer(0);
	GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
	
	//再准备往上行表写
	if(p->NIsReport!=0)
	{//非状态报告
	     strSQL.Format("insert into PHS_DELIVER (MSG_ID,MSG_FORMAT,SRC_TERMID,IS_REPORT,MSG_LEN,\
		 MSG_CONT,DEST_TERMID,RECV_TIME) values ('%s','%d','%s','%d',%d,'%s','%s',cast('%s' as datetime)",\
		 p->SMsgID,p->NMsgFormat,p->SSrcTermID,p->NIsReport,p->NMsgLen,\
		 p->sMsgContent,p->sDestTermID,p->sRecvTime);
	     pSQL=strSQL.GetBuffer(0);
		 GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
	}
	else
	{//状态报告
		CString sCont=_T("");
		sCont.Format("%s",p->sMsgContent);
		if( (-1==sCont.Find("id:"))||(-1==sCont.Find("sub:"))||
			(-1==sCont.Find("stat:"))||(-1==sCont.Find("err:"))||
			(-1==sCont.Find("submit:")) )
		{
			CString str=_T("");
			str.Format("收到一个错误内容的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
			WriteLogFile(str);
			return;
		}
		CString ID=_T("");
		CString stat=_T("");
		CString Err=_T("");

		int nPosition=sCont.Find("sub:");
		ID=sCont.Left(nPosition);
		ID.TrimLeft();
		ID.TrimRight();
		int len=ID.GetLength();
		ID=ID.Right(len-3);

		int nFirst=sCont.Find("stat:");
		int nNext=sCont.Find("err:");
		stat=sCont.Mid(nFirst+5,nNext-nFirst-5);
		stat.TrimLeft();
		stat.TrimRight();
		
		nFirst=nNext;
		nNext=sCont.Find("err:");
		Err=sCont.Mid(nFirst+4,nNext-nFirst-4);
		Err.TrimLeft();
		Err.TrimRight();

		CString str=_T("");
		str.Format("select seq from PASSMSG where REPORT_SN='%s'",ID);
		CRecSet RecSet(GlobalVar.DB.DBSQLServer.pDatabase);
		RecSet.OpenRecordSet(str);
		short RetValue=RecSet.RecordCount;
		if(0==RetValue)
		{
			CString str=_T("");
			str.Format("收到一个流水号不存在的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
			WriteLogFile(str);
			return;
		}
		if(RetValue>1)
		{
			CString str=_T("");
			str.Format("收到一个流水号重复的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
			WriteLogFile(str);
		}
		str.Format("update passmsg set IS_SEND_S=%s,F_RSON_SEND='%s' where REPORT_SN='%s'",\
			stat,Err,ID);//stat 的具体值还需要查阅相关文档
		pSQL=str.GetBuffer(0);
		GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
	}
}

⌨️ 快捷键说明

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