📄 serverthread.cpp
字号:
break;
}
}
return bFree;
}
BOOL CServerThread::IsFiltrateMsg(CString strMessage, CString &strReBack, BOOL &bFeedBack)
{
//0-匹配,1-匹配头,2-匹配尾,3-多项匹配
BOOL bFiltrate = false;
CString strTmp;
strMessage.MakeUpper();
bFeedBack = false;
for (int i=0;i<m_nFiltrateNum;i++)
{
strTmp = m_sFiltrateMsg[i].strFilMsg;
if (strMessage.Find(strTmp) != -1)
{
if (m_sFiltrateMsg[i].bFeedBack)
{
strReBack = m_sFiltrateMsg[i].strFeedBack;
bFeedBack = true;
}
else
bFeedBack = false;
bFiltrate = true;
}
}
return bFiltrate;
}
void CServerThread::LoadFiltrateMsg()
{
CSqlExec sql_get(&m_database) ;
CString strSql,strMsg;
strSql.Format("SELECT * FROM gr_message_filter where type <= %d ",m_nFilType);
sql_get.SetSqlStatement(strSql);
if( !sql_get.Open())
{
strMsg.Format("执行SQL语句出错:%s",strSql);
LogMsg(strMsg);
return;
}
sql_get.FetchAllData();
m_nFiltrateNum = sql_get.RowCount();
if(m_sFiltrateMsg != NULL)
{
delete [] m_sFiltrateMsg;
m_sFiltrateMsg = NULL;
}
m_sFiltrateMsg = new FiltrateMsg[m_nFiltrateNum];
for(int row=0; row<m_nFiltrateNum;row++)
{
m_sFiltrateMsg[row].bFeedBack = atoi(sql_get.GetFieldValue(row,"reback")); //是否匹配
m_sFiltrateMsg[row].strFilMsg = TrimStr(sql_get.GetFieldValue(row,"content")); //匹配关键字
m_sFiltrateMsg[row].strFeedBack = TrimStr(sql_get.GetFieldValue(row,"feedback")); //反馈内容
}
}
void CServerThread::LoadFreeUser()
{
CSqlExec sql_get(&m_database) ;
CString strSql,strMsg;
strSql.Format("SELECT * FROM gr_cmd_freeuser order by mobile ");
sql_get.SetSqlStatement(strSql);
if( !sql_get.Open())
{
strMsg.Format("执行SQL语句出错:%s",strSql);
LogMsg(strMsg);
return;
}
sql_get.FetchAllData();
m_nFreeUserNum = sql_get.RowCount();
if(m_pstrFreeUser != NULL)
{
delete [] m_pstrFreeUser;
m_pstrFreeUser = NULL;
}
m_pstrFreeUser = new CString[m_nFreeUserNum];
for(int row=0; row<m_nFreeUserNum;row++)
{
m_pstrFreeUser[row] = TrimStr(sql_get.GetFieldValue(row,"mobile"));
}
}
void CServerThread::LogMsg(const char *szMsg)
{
CTcpAsyncSocket *pstMoniterSocket;
CString strMsg;
CTime stTime = CTime::GetCurrentTime();
printf("[%d-%d %02d:%02d:%02d]%s\r\n",stTime.GetMonth(),stTime.GetDay(),stTime.GetHour(),stTime.GetMinute(),stTime.GetSecond(),szMsg);
strMsg.Format("[%d-%d %02d:%02d:%02d]%s\r\n",stTime.GetMonth(),stTime.GetDay(),stTime.GetHour(),stTime.GetMinute(),stTime.GetSecond(),szMsg);
for(int i=0;i<m_stMoniterNodeBuf.GetSize();i++)
{
pstMoniterSocket =(CTcpAsyncSocket *)m_stMoniterNodeBuf.GetAt(i);
if(SendPacket(pstMoniterSocket,(unsigned char*)strMsg.LockBuffer(),strMsg.GetLength()) == -1)
{ //new added by ps 2001.8.27 for clean unused socket
pstMoniterSocket->Close();
delete m_stMoniterNodeBuf.GetAt(i);
m_stMoniterNodeBuf.RemoveAt(i);
}
strMsg.UnlockBuffer();
}
}
void CServerThread::Quit()
{
SServerNodeBuffer *pstServerNodeBuf;
CTcpAsyncSocket *pstSocket;
int i;
for(i=0;i<m_stServerNodeBuf.GetSize();i++)
{
pstServerNodeBuf =(SServerNodeBuffer *)m_stServerNodeBuf.GetAt(i);
SendCmppTerminate(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();
}
BOOL CServerThread::InitSocket()
{
m_stMoniterSocket.Close();
m_stMoniterSocket.Create(m_nMoniterPort);
m_stMoniterSocket.SetNonBlockingMode(false);
m_stMoniterSocket.Listen();
_beginthread(AcceptMoniterProc,0,this);
return TRUE;
}
int CServerThread::GetMinUnHandleServerIndex()
{
SServerNodeBuffer *pstServerNodeBuf;
int nMinUnHandleNumber;
int nIndex = -1;
for(int i=0;i<m_stServerNodeBuf.GetSize();i++)
{
pstServerNodeBuf =(SServerNodeBuffer *)m_stServerNodeBuf.GetAt(i);
if(nIndex == -1)
{
if(pstServerNodeBuf->m_iConnected == CMPP_STATUS_CONNECTED)
{
nMinUnHandleNumber = pstServerNodeBuf->m_nUnHandleNumber;
nIndex = i;
}
}
else
{
if((pstServerNodeBuf->m_iConnected == CMPP_STATUS_CONNECTED) && pstServerNodeBuf->m_nUnHandleNumber < nMinUnHandleNumber)
{
nMinUnHandleNumber = pstServerNodeBuf->m_nUnHandleNumber;
nIndex = i;
}
}
}
return nIndex;
}
void CServerThread::WriteActiveFlag()
{
static tOldTime2=time(NULL);
time_t tCurTime;
double lDiffTime;
CString strTrace;
time(&tCurTime);
lDiffTime = abs(difftime(tCurTime , tOldTime2)) - 30;
if (lDiffTime > 0 ){
TRY
{
CFile f( m_szActiveFlag, CFile::modeCreate | CFile::modeWrite );//1202 m_szActiveFlag= iqdevp0.pid
f.Close();
}
CATCH( CFileException, e )
{
strTrace.Format("%s cant be created.",m_szActiveFlag);
LogMsg(strTrace);//1202
}
END_CATCH
tOldTime2 = tCurTime;
}
}
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);
return;
}
}
BOOL CServerThread::SubmitToDatabase(const char *szSql)
{
CSqlExec sql_sm(&m_database);
sql_sm.SetSqlStatement(szSql);
if(!sql_sm.Open())
{
printf("执行SQL语句错误:%s\n",szSql);
LogFile(szSql);
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CServerThread::AnalyseMessage(CString &strSrc, CString &strDest, CString strDivision)
{
int nPos = -1,nLen=0;
CString strTmp;
BOOL bAnalyse = false;
strTmp.Format("%s",strSrc);
if (strTmp.IsEmpty())
bAnalyse = false;
else
bAnalyse = true;
nLen = strDivision.GetLength();
nPos = strTmp.Find(strDivision);
if (nPos != -1)
{
strDest = strTmp.Left(nPos);
strSrc = strTmp.Mid(nPos+nLen);
}
else
{
strDest = strSrc;
strSrc = "";
}
return bAnalyse;
}
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;
}
int CServerThread::SendMessage(CString strMobile, CString strTempMessage, CString strChargeNumber, CString strSender, CString strServiceType, CString strLinkID, char cFeeType, CString strFeeValue, CString strGivenValue, const char *szScheduleTime, char cMessageCoding, int nMOtoMTFlag, int iStatusRpt,int mobiletype,int feenumtype)
{
int nRet;
if(m_nIndex && bLongMessageFree) //一条短消息拆成多条发送时非第一条免费
{
strFeeValue.Format("%d",m_overfee.iFeeValue);
strGivenValue.Format("%d",m_overfee.iGivenValue);
if (!m_overfee.strServiceType.IsEmpty())
strServiceType.Format("%s",m_overfee.strServiceType);
nMOtoMTFlag = m_overfee.iMotomtFlag;
cFeeType = m_overfee.iFeeType;
}
if(IncludeChinese(strTempMessage))
{
nRet = SendShortMessage(strMobile,strTempMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
strFeeValue,strGivenValue,"",15,nMOtoMTFlag,iStatusRpt,m_nPriority,m_nExpireSpan,mobiletype,feenumtype);
}
else
{
nRet = SendShortMessage(strMobile,strTempMessage,strChargeNumber,strSender,strServiceType,strLinkID,cFeeType,
strFeeValue,strGivenValue,"",CMPP_DC_ASCII,nMOtoMTFlag,iStatusRpt,m_nPriority,m_nExpireSpan,mobiletype,feenumtype);
}
Sleep(m_nContinueSendTimes);
m_nIndex++;
if(nRet == -1)
return -1;
// 日志记录 每条记录
SubmitToSendMsgLog(strTempMessage,strMobile,strSender,strChargeNumber,strServiceType,strLinkID,cFeeType,strFeeValue,strGivenValue,nMOtoMTFlag);
return 0;
}
int CServerThread::SendPacket(CTcpAsyncSocket *pstSocket, unsigned char *szSendBuf, int 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;
}
int CServerThread::GetWorsNumOfStr(CString strMsg)
{
//把字母数字空格等单字节的字符当作双字节,一个汉字为双字节,因此这里定义两个字节为一个汉字
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -