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

📄 serverthread.cpp

📁 vc开发的一个cmpp(中国移动点对点通讯)通讯程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -