📄 server.cpp
字号:
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 + -