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

📄 deliverthread.cpp

📁 一个用vc开发的Sgip通讯程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	
/*
	if (pstReport->cReportType == 1)//图片
	{
		if(pstReport->cState==0)//发送成功
		{
		    strSql.Format("update gr_Status_rpt set StatusRpt='%d',RptTime=getdate(),Result=0 \
            where msgid='%s'",pstReport->cErrorCode,strMsgID);
		}
	    else
		{
		    strSql.Format("update gr_Status_rpt set StatusRpt='%d',RptTime=getdate(),Result=1 \
            where msgid='%s'",pstReport->cErrorCode,strMsgID);
		}

		sql_db.SetSqlStatement(strSql);
	    sql_db.Open();
	}
*/
	if (pstReport->cReportType == 0) //0,对先前一条Submit命令的状态报告;1,对先前一条前转Deliver命令的状态报告
	{
		if (m_bReport && pstReport->cState != 0) //等待发送或发送失败
	//	if ( m_bReport ) //等待发送或发送失败 modify by gyh at 2003/12/15
		{
		    strSql.Format("insert into gr_Status_rpt(statusRpt,RptTime,Result,MsgId,mobile) values('%d',getdate(),%d,'%s','%s') ",
			    pstReport->cErrorCode,pstReport->cState,strMsgID,pstReport->szUserNumber);
		    sql_db.SetSqlStatement(strSql);
	        if (!sql_db.Open())
			{
				strTmp.Format("执行%s失败!",strSql);
				LogMsg(strTmp);
				LogFile(strTmp);
				ACTIVE_FLAG = false;
				return true;
			}
		}
	}

    printf("状态报告序列号:%s\n",strMsgID);
	//开启搜索禁止
	if (m_bForbid)
	{
		if (!IsTimeToForbidMobile())
			return true;

		//执行存储过程
		strSql.Format("exec forbidmobile");
		sql_db.SetSqlStatement(strSql);
	    if (!sql_db.Open())
		{
            LogMsg("执行ForbidMobile存储过程失败!");
			LogFile("执行ForbidMobile存储过程失败!");
			return true;
		}

		sql_db.FetchAllData();
	    nRecCount = sql_db.RowCount();
	    if (nRecCount > 0)
		{
			nInValid = atoi(sql_db.GetFieldValue(0,"ST"));
			if (nInValid > 0)
			{
			    //重新载入零星号段
		        LoadInValidMobile();
			}
		}
	}
		
	return true;
}

BOOL CDeliverThread::HandleDeliverPdu(SClientNodeBuffer *pstNodeBuf,const char* szRecvBuf)
{
	char			szTrace[300];
	char			szShortMsg[200];
	char			szLinkID[9];
	CString			strSql,strMoTable,strTmp,strTempMsg,strLinkID;  
	CSqlExec		sql_db(&m_database);
	SSGipDeliver	*pstDeliver;
	CString			strSender,strShortMsg;
	CString			strDest,strResult,strTmp1,strServiceType;
	int				nMsgLen;//added by zsc,去掉协议外的信息 2003-8-6

	SendSGipDeliverResp(pstNodeBuf,szRecvBuf,SGIP_OK);
	pstDeliver =(SSGipDeliver*)(szRecvBuf + PDU_HEADER_SIZE);
	nMsgLen = ntohl(pstDeliver->nMessageLength);
	int nLinkidPos = PDU_HEADER_SIZE + sizeof(SSGipDeliver) - MAX_MESSAGE_LENGTH + nMsgLen - 8;
	memcpy(szLinkID,(szRecvBuf+nLinkidPos),8);
	szLinkID[8] = '\0';

	switch(pstDeliver->cMessageCoding)
	{
	case SGIP_DC_ASCII:{	
//		strcpy(szShortMsg,pstDeliver->szMessageContent);
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';//added by zsc,去掉协议外的信息
		//LogMsg("收到ASCII信息");
		}
		break;
	case SGIP_DC_GB2312:{
//		strcpy(szShortMsg,pstDeliver->szMessageContent);
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';
		//LogMsg("收到中文信息");
		}
		break;
	case SGIP_DC_UCS2://unicode
		UnicodeToAnsi(pstDeliver->szMessageContent,ntohl(pstDeliver->nMessageLength),szShortMsg);
		//LogMsg("收到Unicode编码信息");
		break;
	default:{
		//LogMsg("收到其余格式短信");
//		strcpy(szShortMsg,pstDeliver->szMessageContent);
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';
		strTmp1.Format("其余格式短信:用户%s,短信%s,编码各式%d",pstDeliver->szUserNumber,szShortMsg,pstDeliver->cMessageCoding);
		LogMsg(strTmp1);
		LogFile(strTmp1);
		if (m_bRecieve)
		    break;
		else
			return false;
		}
	}

	sprintf(szTrace,"[MO]收到%s的短信:%s,发送人:%s",pstDeliver->szUserNumber,szShortMsg,pstDeliver->szSPNumber);
	LogMsg(szTrace);
	

	strSender=TrimStr(pstDeliver->szSPNumber);
	strTempMsg = TrimStr(szShortMsg) ;
	strDest=TrimStr(pstDeliver->szUserNumber);
	strLinkID.Format("%s",szLinkID);    //add by qjf MO和MT之间一一对应 2004-2-9

	strTempMsg.Replace("'","''") ;
	strShortMsg.Format("%s",strTempMsg);
	strcpy(szShortMsg,strTempMsg) ;
    
    /////////////////////////////////////////////////////

	CString strTemp = strShortMsg.Mid(0,4);
	//add by lzq 
	int iFlag = 0;
	if(strTemp.Compare("0001") == 0)
		iFlag = 1;
	else if(strTemp.Compare("8003") == 0)
		iFlag = 2;
	if(iFlag)
	{
		SubmitToDeliverLog(szShortMsg,strDest,strSender,strLinkID);
		CString csRecMobile = strDest;
		if(iFlag == 1)//同步确认
		{
			CString strContent ;
			strContent = GetResMsg(strShortMsg,strServiceType,csRecMobile,iFlag);
			SubmitToOrderSend(strContent,"10109696",strSender,strLinkID,strServiceType);
		}
		CString csDeliverMsg = szShortMsg;
//		LogMsg(csDeliverMsg,1);
		if(strSender == "21012")
		{
			strMoTable = "gr_deliver_voice";
			CString csTempStr = "1";
			if(csDeliverMsg.GetLength() > 5)
				csTempStr	= csDeliverMsg.Mid(5,1);
			if(csTempStr == "1")
				csDeliverMsg = "X";
			else
				csDeliverMsg = "XQ";
		}else
			GetMoTabName(strShortMsg,strMoTable,strSender);
		if(!strMoTable.IsEmpty())
		{
			SubmitToTable(csDeliverMsg,csRecMobile,strSender,strLinkID,strMoTable);
		}
		//end of add
		return true;
	}
	
	//end of add by lzq
	// add by ycf 20020825
	if(m_bEnableNumCtrl //m_bEnableNumCtrl是号码段控制功能开关
		&& !IsEnableMobile(strDest))
	{   //判断是否是本地区的有效号码段 valid mobile Number
		SubmitToSend(m_szErrMobileMsg,strDest,strSender,strLinkID,TRUE);
		return true;
	}
    
	// add by ycf 20020912
	if (m_bEnableGameQuit)
	{
        strTempMsg.MakeUpper();
		strTempMsg.Replace("+","");

//		if (strTempMsg.CompareNoCase(m_szCancelAll) == 0)
		if ( ( strTempMsg.CompareNoCase(m_szCancelAll) == 0 )
		  || ( strTempMsg.CompareNoCase(m_szEqualAll)  == 0 )  )
		{
			if( IsGameUser( strDest.Right(11) ) ){
				//取消全部(执行存储过程)
				strSql.Format("exec gamequitall '%s' ",strDest.Right(11));
				SubmitToDatabase(strSql);

				strTmp.Format("%s",m_szCancelAllHelp);
				SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
				SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
			}
			else{
				strTmp.Format("%s",m_szCancelHelp2);
				SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
				SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
			}
		    return true;
		}

		if ( ( strTempMsg.Find(m_szCancel) == 0 ) || ( strTempMsg.Find(m_szEqual) == 0 ) )		{
		    strResult = GameQuitCmd(strDest,strTempMsg,strShortMsg);  
		    if (strShortMsg.IsEmpty())
		        strTmp.Format("%s",strResult);
		    else
		        strTmp.Format("%s",strShortMsg);
		    SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
		    SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
		    return true;
		}
	}

	GetMoTabName(strShortMsg,strMoTable,strSender);
	if(strMoTable.IsEmpty())
	{
		strTmp.Format("%s",m_szHelp);
		SubmitToTable(strShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
		SubmitToSend(strTmp,strDest,strSender,strLinkID,FALSE);
	}
	else
	{
		if (m_bMonth)  //开启包月功能
            SubmitToMonthTable(strShortMsg,strDest,strSender,strLinkID,strMoTable);

		SubmitToTable(strShortMsg,strDest,strSender,strLinkID,strMoTable);
	}

	SubmitToDeliverLog(szShortMsg,strDest,strSender,strLinkID);

	return true;
}

CString CDeliverThread::GameQuitCmd(CString strMobile,CString strSrcCmd,CString &strMessage)
{
    CString strTmp,strQuitSql,strSql,strSrc,strGameSql;
    CString strResult,strTemp1,strTemp2,strTemp;
	BOOL bOrder = true;

	strMessage.Empty();
    strResult.Empty();

	if (strMobile.Find("86") == 0)
		strSrc = strMobile.Mid(2);
	else
		strSrc = strMobile;

	if( strSrcCmd.Find(m_szCancel) == 0 )
		strTmp = TrimStr(strSrcCmd.Mid(strlen(m_szCancel)));
	else
		strTmp = TrimStr(strSrcCmd.Mid(strlen(m_szEqual)));
	strTmp.Replace("+","");

	for (int i=0;i< m_nGameQuitNum;i++)
	{
		if (strTmp.CompareNoCase(m_sGameQuit[i].strSrcCmd) == 0)
		{
			//取消部分
			strSql = m_sGameQuit[i].strQuitSQL;
			if (strSql.IsEmpty())
			    continue;
            strQuitSql.Format(strSql,strSrc); //modify by ycf 20021112
			SubmitToDatabase(strQuitSql);
		    strMessage = m_sGameQuit[i].strMessage;
			bOrder = false;
			break;
		}
	}

	if (bOrder) //定制各项业务
	{
        for (int i=0;i<m_nGameQuitNum;i++)
		{
			strGameSql = TrimStr(m_sGameQuit[i].strGameSQL);
			if (strGameSql.IsEmpty())
				continue;

			if (IsGameUser(strGameSql,strSrc))
			{
				    strTemp1  = TrimStr(m_sGameQuit[i].strSrcCmd);
					strTemp2  = TrimStr(m_sGameQuit[i].strGameName);
				    strTemp  += " "+strTemp1+":"+strTemp2;
			}
		}

		if (strTemp.IsEmpty())
		{
		    strResult.Format("%s",m_szCancelHelp2);
		}
		else
		{
			strTemp1.Format("%s",m_szCancelHelp1);
			strTemp1.Replace("@@","%s");
			strResult.Format(strTemp1,strTemp);
		}
	}

	return strResult;
}

BOOL CDeliverThread::IsGameUser(CString strGameSql,CString strSrc)
{
    CSqlExec sql_Get(&m_database);
	int nRecCount = -1,nCount = 0;
	CString strSql,strTmp;
	BOOL bUser = false;
    
	strSql.Format(strGameSql,strSrc);
	sql_Get.SetSqlStatement(strSql);
	if (!sql_Get.Open())
	{
		return false;
	}

	sql_Get.FetchAllData();
    nRecCount = sql_Get.RowCount();
	if (nRecCount > 0)
	{
	    nCount = atoi(sql_Get.GetFieldValue(0,"ST")); //modify by ycf 20021122
		if (nCount > 0)
		    bUser = true;
		else
			bUser = false;
	}

	return bUser;
}

CString CDeliverThread::GetQuitSQL(CString strSql,CString strSrc)
{   //QUITSQL
	CString strResult;
	char szTmp;
	int nCount=1;

	for (int i=0;i<strSql.GetLength();i++)
	{
		szTmp = strSql.GetAt(i);
		if (szTmp == '@')
			nCount++;
	}
    
	strSql.Replace("@","%s"); //

	if (nCount > 1) //
		nCount--;

	switch (nCount)
	{//支持6个
	case 1:
		strResult.Format(strSql,strSrc);
		break;
	case 2:
		strResult.Format(strSql,strSrc,strSrc);
		break;
	case 3:
		strResult.Format(strSql,strSrc,strSrc,strSrc);
		break;
	case 4:
		strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc);
		break;
	case 5:
		strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc,strSrc);
		break;
	case 6:
		strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc,strSrc,strSrc);
		break;
	default:
        strResult.Format(strSql,strSrc);
		break;
	}

	return strResult;
}

BOOL CDeliverThread::SubmitToDatabase(const char *szSql)
{
    CSqlExec	sql_sm(&m_database);
	CString strMsg;

	sql_sm.SetSqlStatement(szSql);
	if(!sql_sm.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",szSql);
		LogMsg(strMsg);
		LogFile(strMsg);
		return false;
	}

	return true;
}
void CDeliverThread::SubmitToDeliverLog(const char *szMsg, const char *szSAddr, const char *szDAddr, const char *szLinkID)
{
	CSqlExec	sql_deliver(&m_database);
	CString		strSql;
	CString		strSAddr,_strSAddr,strDAddr,_strDAddr;
	CTime		ctTime = CTime::GetCurrentTime();
	CString		strMsg;
    
    _strSAddr = szSAddr;
	_strDAddr = szDAddr;

	if (_strSAddr.Find("86") == 0)
		strSAddr = _strSAddr.Right(_strSAddr.GetLength()-2);
	else
		strSAddr = _strSAddr;
    
	if (_strDAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDAddr.Find("86") == 0)
		    strDAddr = _strDAddr.Right(_strDAddr.GetLength()-2);
		else
            strDAddr = _strDAddr;
	}
	else
		strDAddr = _strDAddr;
	
	if(!m_bDeliverToEveryDayTable)
	{
		strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid) \
            values('%s','%s','%s','%s',)",m_szDeliverLogTableName,szMsg,strSAddr,strDAddr,szLinkID);
	}
	else
	{
		strSql.Format("insert into %s_%02d(short_msg,src_addr,dst_addr,linkid) \
            values('%s','%s','%s','%s')",m_szDeliverLogTableName,ctTime.GetDay(), szMsg,strSAddr,strDAddr,szLinkID);
	}

	sql_deliver.SetSqlStatement(strSql);
	if(!sql_deliver.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		LogFile(strMsg);
	}
}

int CDeliverThread::SendPacket(CTcpAsyncSocket *pstSocket,unsigned char* szSendBuf,int nSendLen)
{
//	int nLen = pstSocket->Send(szSendBuf,nSendLen);
	int nBytes,nBytesLeft=nSendLen;
	int nBytesSent=0;
	if(pstSocket->m_hSocket)	
	{
		while (nBytesLeft>0)
		{
			nBytes=pstSocket->Send(szSendBuf+nBytesSent,nBytesLeft);
			if(nBytes >nBytesLeft)
				return 0;
			if(nBytes <=0)
			{
				int nError=GetLastError( );
				pstSocket->m_hSocket=INVALID_SOCKET;
				return -1;
			}
			nBytesSent+=nBytes;
			nBytesLeft-=nBytes;
		}
	}
	return nBytesSent;
}

void CDeliverThread::Quit()
{
	SClientNodeBuffer *pstClientNodeBuf;
	SDeliverNodeBuffer *pstDeliverNodeBuf;
	CTcpAsyncSocket *pstSocket;
	int i,k;

	for(i=0;i<m_stDeliverNodeBuf.GetSize();i++)
	{
		pstDeliverNodeBuf =(SDeliverNodeBuffer *)m_stDeliverNodeBuf.GetAt(i);
		for(k=0;k<pstDeliverNodeBuf->m_stClientNodeBuf.GetSize();k++)
		{
			pstClientNodeBuf =(SClientNodeBuffer *)pstDeliverNodeBuf->m_stClientNodeBuf.GetAt(k);
			pstClientNodeBuf->m_pstClientSocket->Close();
			delete pstClientNodeBuf->m_pstClientSocket;
			delete pstDeliverNodeBuf->m_stClientNodeBuf.GetAt(k);
		}
		pstDeliverNodeBuf->m_stClientNodeBuf.RemoveAll();
		pstDeliverNodeBuf->m_stListenSocket.Close();
		delete m_stDeliverNodeBuf.GetAt(i);

⌨️ 快捷键说明

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