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

📄 server.cpp

📁 一个用vc开发的Sgip通讯程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				strSender=m_szSPNumber;
			}
			else
			{
				strSender=strSender.Left(21);	
			}
		}
		else
		{
			strSender=m_szSPNumber;	 //不定义发送人		
		}

//		if(strMobile.GetLength()==11 ||(strMobile.GetLength()==13 && strMobile.Left(2)=="86"))
		if(true)
		{
			if(strChargeNumber.IsEmpty()) //如为空,对mobile记费
			{
				strChargeNumber=strMobile;
			}

			if (m_bFreeUser && IsFreeUser(strMobile))
			{
				//免费用户
                strServiceType = m_freefee.strServiceType;
				cFeeType       = m_freefee.iFeeType;
				strFeeValue.Format("%d",m_freefee.iFeeValue);
				strGivenValue.Format("%d",m_freefee.iGivenValue);
                nMOtoMTFlag    = m_freefee.iMotomtFlag;
			}

			if( strMsgType=="0" )		//短信
			{
				//add by ycf 20020916
				if (m_bFiltrate  && IsFiltrateMsg(strMessage,strReBack,bFeedBack))
				{   
					//记录过滤日志
					SubmitToSendFilLog(strMessage,strMobile,strSender,strChargeNumber,strServiceType,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);
					if (!bFeedBack)
					{
						//删除短信
						strSql.Format("delete from %s where id=%s",m_szTableName,strID);
						SubmitToDatabase(strSql);
						continue;
					}
					else
                        strMessage = strReBack;
				}

				strMsg = strMessage;
//				if(strMobile.GetLength()>= 11 && strMessage.GetLength()>0) 
				if(strMessage.GetLength()>0) 
				{
					CString strTempMessage;

					if (strMessage.Find("##") != -1) //分割符限制
					{
						 m_nIndex = 0;
						 while(AnalyseMessage(strMessage,strTempMessage,"##"))
						 {
						     nRet = SendMessage(strMobile,strTempMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
				                 strFeeValue,strGivenValue,"",15,nMOtoMTFlag,iStatusRpt);
							 if (nRet == -1)
								 break;
						 }
					}
					else
					{
						m_nIndex = 0;

						if (IncludeChinese(strMessage))
						{
                            SHORT_MESSAGE_SPLIT_LENGTH = 70; //拆分长度
							iDataEnCode   = 15;
						}
						else
						{
                            SHORT_MESSAGE_SPLIT_LENGTH = 140; //拆分长度
							iDataEnCode   = 0;
						}

						while(AnalyseMessage(&strMessage,&strTempMessage))
						{
							nRet = SendMessage(strMobile,strTempMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
				                 strFeeValue,strGivenValue,"",iDataEnCode,nMOtoMTFlag,iStatusRpt);   
							if (nRet == -1)
								break;
						}
					}

					if(nRet == -1)
					{
						g_bConnect	= false;
						return;
					}
				}
			}
			//发送闪烁短信
			else if (strMsgType == "2" )
			{
				strMsg  = strMessage;
				strFlash.Format("%c",0x01);
				strMessage.Replace("@@",strFlash);
                nRet = SendShortMessage(strMobile,strMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
				        strFeeValue,strGivenValue,"",15,nMOtoMTFlag,iStatusRpt,m_nPriority,m_nExpireSpan);
				// 日志记录
				SubmitToSendMsgLog(strMsg,strMobile,strSender,strChargeNumber,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);
			}
			//发送免提短信
			else if (strMsgType == "3" )
			{
				if (IncludeChinese(strMessage))
				{
					char pMessage[140]={'\0'};
					strcpy(pMessage,strMessage);		
					AnsiToEncode(pMessage,strlen(strMessage),strMsg);
					nRet = SendShortMessage(strMobile,strMsg,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
						strFeeValue,strGivenValue,"",24,nMOtoMTFlag,iStatusRpt,m_nPriority,3,m_nExpireSpan);
				}
				else
					nRet = SendShortMessage(strMobile,strMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
						strFeeValue,strGivenValue,"",16,nMOtoMTFlag,iStatusRpt,m_nPriority,3,m_nExpireSpan);
				// 日志记录
				SubmitToSendMsgLog(strMessage,strMobile,strSender,strChargeNumber,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);
			}
			//发送动感短信
			else if (strMsgType == "4" )
			{
                strMsg  = strMessage;
				strFlash.Format("%c",0x0A);
				strMessage.Replace("&&",strFlash);
				strFlash.Format("%c",0x01);
				strMessage.Replace("@@",strFlash);

                nRet = SendShortMessage(strMobile,strMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
				        strFeeValue,strGivenValue,"",15,nMOtoMTFlag,iStatusRpt,m_nPriority,m_nExpireSpan);
				
				// 日志记录
				SubmitToSendMsgLog(strMsg,strMobile,strSender,strChargeNumber,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);
			}
			else	//图片和铃声发送
			{
				SendOnePicture(strMobile,strChargeNumber,strSender,strMessage,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag,atoi(strMsgType),iCount,iStatusRpt,m_nPriority);
				Sleep(m_nContinueSendTimes);
                
				iFeeValue = atoi(strFeeValue);

				if (iFeeValue >= 100)
				    strFeeValue.Format("%d",iFeeValue);
				else
                    strFeeValue.Format("%d",iCount*iFeeValue);

				// 日志记录
				SubmitToSendMsgLog(strMessage,strMobile,strSender,strChargeNumber,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);				
			}		
		}
		else
		{
			printf("非法手机号:%s",strMobile);
		}
		strSql.Format("delete from %s where id=%s",m_szTableName,strID);
		sql_delete.SetSqlStatement(strSql);
		if(!sql_delete.Open())
		{
            return;		
		}
	}
}

void CServerThread::ProcessReceivePdu()
{
	SServerNodeBuffer *pstServerNodeBuf;
	char szRecvBuf[MAX_PACKET_SIZE +1];
	int  nRecvLen,i;

	for(i=0;i<m_stServerNodeBuf.GetSize();i++)
	{
		pstServerNodeBuf =(SServerNodeBuffer *)m_stServerNodeBuf.GetAt(i);
		memset(szRecvBuf,'\0',MAX_PACKET_SIZE +1);
		nRecvLen = ReceivePdu(&pstServerNodeBuf->m_stSocket,szRecvBuf,MAX_PACKET_SIZE);
		if(nRecvLen >0)
		{  //收到服务器应答信息
			szRecvBuf[nRecvLen] ='\0';
			HandleServerMsg(pstServerNodeBuf,szRecvBuf,nRecvLen);
		}
	}
}

void CServerThread::Quit()
{
	SServerNodeBuffer *pstServerNodeBuf;
	CTcpAsyncSocket *pstSocket;
	int i;

	for(i=0;i<m_stServerNodeBuf.GetSize();i++)
	{
		pstServerNodeBuf =(SServerNodeBuffer *)m_stServerNodeBuf.GetAt(i);
		SendSGipUnBind(pstServerNodeBuf);
		pstServerNodeBuf->m_stSocket.Close();
		delete m_stServerNodeBuf.GetAt(i);
	}
	m_stServerNodeBuf.RemoveAll();
	
	for(i=0;i<m_stMoniterNodeBuf.GetSize();i++)
	{
		pstSocket =(CTcpAsyncSocket *)m_stMoniterNodeBuf.GetAt(i);
		pstSocket->Close();
		delete m_stMoniterNodeBuf.GetAt(i);
	}
	m_stMoniterNodeBuf.RemoveAll();
	m_stMoniterSocket.Close();
}

int CServerThread::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CServerThread, CWinThread)
	//{{AFX_MSG_MAP(CServerThread)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CServerThread message handlers

int CServerThread::Run() 
{
	InitSocket();

	while(!g_bExit)
	{
		if(m_bConnectToDB)
		{
			ProcessReceivePdu();
			QueryRecord();
			HandleTask();
			HandleActiveTest();	
			Sleep(50);
		}
		else
		{
			ConnectDB();
			Sleep(1000);
		}
	}
	m_database.Close();
	Quit();
	return 0;
}

BOOL CServerThread::AnalyseMessage(CString *strSrc, CString *strDest)
{
   CString sSrcMsg,sDestMsg;
   int     iDesStrLenght,iPos,iCounter;//iMsgLength,

   sSrcMsg = *strSrc;
   if(sSrcMsg.IsEmpty())
	   return false;

   if( GetWorsNumOfStr(sSrcMsg) > SHORT_MESSAGE_SPLIT_LENGTH ){

       sDestMsg = GetLeftTChar(sSrcMsg,SHORT_MESSAGE_SPLIT_LENGTH,0,iDesStrLenght);
	   iPos=sDestMsg.GetLength();
       if( !IsDigital( sSrcMsg.GetAt(iPos) ) ){//当第二段的第一个字符不为数字时,
		   *strDest = sDestMsg ;               //    说明没有把一个数字截为两段
		   *strSrc  = sSrcMsg.Mid(iDesStrLenght); //sSrcMsg.Mid(m_iMsgLength+iBack);  
           return true;  
	   }
	   //当第二段的第一个字符为数字时,检查sDestMsg的最后一个字符是否	   
	   iPos=sDestMsg.GetLength()-1;
	   iCounter=0;
	   while( IsDigital( sDestMsg.GetAt(iPos) ) ){
		   iCounter++;
		   iPos--;
		   if(iPos<0) break;
	   }
       if(iPos<0){//当分解出的第一段sDestMsg全为数字时
		   *strDest = sDestMsg;
   		   *strSrc  = sSrcMsg.Mid(iDesStrLenght);//sSrcMsg.Mid(m_iMsgLength+iBack);  
	   }
	   else{//当分解出的第一段sDestMsg 不全为数字时
		   *strDest = sDestMsg.Mid(0,iPos+1);
		   *strSrc  = sSrcMsg.Mid(iDesStrLenght-iCounter);//  sSrcMsg.Mid(m_iMsgLength+iBack-iCounter);  
	   }
   }
   else
   {
       *strDest = sSrcMsg;
       *strSrc  = "";  
   }

   return true;  
}

CString CServerThread::GetLeftTChar(CString strSrc, int iWordsNum, int iStartPos, int &iDestStrLength)
{
//把字母数字空格等单字节的字符当作双字节,一个汉字为双字节,因此这里定义两个字节为一个汉字
	long  lMsgLength = strSrc.GetLength();
	CString NullStr("") ;
	if (!lMsgLength || iStartPos>lMsgLength || iStartPos<0) return NullStr;//当源字串为空或起始位置非法时,返回空串
	char *m_newBuffer = new char [lMsgLength];////////
    LPSTR newTempPtr = m_newBuffer;
	int iCounter;
	char TCharbuf[255];
    //以防止将一半汉字分为两行
	unsigned short halfChinese=0;
	int i=iStartPos;
    iCounter = 0 ;
	while(i<lMsgLength && iCounter<iWordsNum){
		*newTempPtr = strSrc.GetAt(i);
		//大于0xa1的字节为汉字字节
		if((unsigned char)*newTempPtr >= 0xa1)
			halfChinese++;
		TCharbuf[i-iStartPos]=*newTempPtr++;
		if( (halfChinese%2)==0 )//对汉字每两个字节算一个字
            iCounter++;
		i++;
	}
	if (halfChinese%2==1)
		TCharbuf[i-iStartPos-1]='\0';
    else
		TCharbuf[i-iStartPos]='\0';

	CString strResult;
	strResult.Format("%s",TCharbuf);

	delete m_newBuffer;
	iDestStrLength = strResult.GetLength();
	return strResult;
}

int CServerThread::GetWorsNumOfStr(CString strMsg)
{
//把字母数字空格等单字节的字符当作双字节,一个汉字为双字节,因此这里定义两个字节为一个汉字
	int  iStrLength = strMsg.GetLength();
	char *m_newBuffer = new char [iStrLength];
	LPSTR newTempPtr = m_newBuffer;
	unsigned short halfChinese=0;
	int  iNumOfWords = 0;
	int  iPos=0;
	while( iPos<iStrLength ){
		*newTempPtr = strMsg.GetAt(iPos);
		//大于0xa1的字节为汉字字节
		if((unsigned char)*newTempPtr >= 0xa1)
			halfChinese++;
		if( (halfChinese%2)==0 )//对汉字每两个字节算一个字
		    iNumOfWords++;
		iPos++;
	}
	delete m_newBuffer;

	return iNumOfWords;
}

BOOL CServerThread::IsDigital(char cSrc)
{
	if((cSrc>='0')&&(cSrc<='9'))
        return true;
	else
		return false;
}

void CServerThread::SubmitToSendMsgLog(const char *szMsg,const char *szMobile,const char *szSender,const char *szFeeNum, const char * szServiceType,const char * szLinkID,int cFeeType,const char * szFeeValue,const char * szGivenValue,int nMotoMtFlag)
{
	CSqlExec sql_sendmsg(&m_database);
	CString strSql,strTabName,strMsg;
	CTime ctTime = CTime::GetCurrentTime();
    
	strMsg.Format("%s",szMsg);
	strMsg.Replace("'","''");

    if(!m_bSubmitLogToEveryDayTable)
	{
		strSql.Format("insert into %s(message,mobile,sender,feenum,servicetype,linkid,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%s','%d','%s','%s','%d')",
				   m_szSubmitLogTableName,
				   strMsg,
				   szMobile,
				   szSender,
				   szFeeNum,
				   szServiceType,
				   szLinkID,
				   cFeeType,
				   szFeeValue,
				   szGivenValue,
				   nMotoMtFlag);
	}
	else
	{
		strSql.Format("insert into %s_%02d(message,mobile,sender,feenum,servicetype,linkid,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%s','%d','%s','%s','%d')",
				   m_szSubmitLogTableName,
				   ctTime.GetDay(),
				   strMsg,szMobile,
				   szSender,
				   szFeeNum,
				   szServiceType,
				   szLinkID,
				   cFeeType,
				   szFeeValue,
				   szGivenValue,
				   nMotoMtFlag);
	}
	sql_sendmsg.SetSqlStatement(strSql);

	if(!sql_sendmsg.Open())
	{
		CString	strMsg;
		strMsg.Format("执行SQL出错:%s",strSql);
		LogMsg(strMsg);
		LogFile(strMsg);
		return;
	}
}

void CServerThread::SubmitToSendFilLog(const char *szMsg,const char *szMobile,const char *szSender,const char *szFeeNum, const char * szServiceType,int cFeeType,const char * szFeeValue,const char * szGivenValue,int nMotoMtFlag)
{
	CSqlExec sql_sendmsg(&m_database);
	CString strSql,strTabName,strMsg;
    
	strMsg.Format("%s",szMsg);
	strMsg.Replace("'","''");

   	strSql.Format("insert into gr_sendmessage_filter_log(message,mobile,sender,feenum,servicetype,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%d','%s','%s','%d')",
				   strMsg,
				   szMobile,
				   szSender,
				   szFeeNum,
				   szServiceType,
				   cFeeType,
				   szFeeValue,
				   szGivenValue,
				   nMotoMtFlag);
	sql_sendmsg.SetSqlStatement(strSql);

	if(!sql_sendmsg.Open())
	{
		CString	strMsg;
		strMsg.Format("执行SQL出错:%s",strSql);
		LogMsg(strMsg);
		LogFile(strMsg);
		return;
	}
}

⌨️ 快捷键说明

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