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

📄 deliverthread.cpp

📁 一个用vc开发的Sgip通讯程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	m_stDeliverNodeBuf.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 CDeliverThread::InitInstance()
{
	BOOL	bTrue	= true;
	LogMsg("最新版本V 2.1.0(Build0807)Modify resend message process and exit process.");
	LoadIni();
	while(bTrue && !g_bDeliverThreadExit)
	{
		if(ConnectDB())
		{
			bTrue	= false;
		}
		else
		{
			Sleep(500);
		}
	}

	LoadCmdTab();

	// add by ycf 20020825
	if(m_bEnableNumCtrl)
		LoadMobile();

	if(m_bEnableGameQuit)
		LoadCmdGameQuit();

	_beginthread(RunDeliverProc,0,this);
	return TRUE;
}

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

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

/////////////////////////////////////////////////////////////////////////////
// CDeliverThread message handlers

int CDeliverThread::Run() 
{
	SClientNodeBuffer *pstClientNodeBuf;
	SDeliverNodeBuffer *pstDeliverNodeBuf;
	char szRecvBuf[MAX_PACKET_SIZE +1];
	int  nRecvLen,i,k;

	InitSocket();
    while(!g_bDeliverThreadExit)
	{
		
		if (m_bConnectDeliverDB)
		{
			for(i=0;i<m_stDeliverNodeBuf.GetSize();i++)
			{
				m_pSection[i].Lock(INFINITE);
				pstDeliverNodeBuf =(SDeliverNodeBuffer *)m_stDeliverNodeBuf.GetAt(i);
				for(k=0;k<pstDeliverNodeBuf->m_stClientNodeBuf.GetSize();k++)
				{
					pstClientNodeBuf =(SClientNodeBuffer *)pstDeliverNodeBuf->m_stClientNodeBuf.GetAt(k);
					memset(szRecvBuf,'\0',MAX_PACKET_SIZE +1);
					nRecvLen = ReceivePdu(pstClientNodeBuf->m_pstClientSocket,szRecvBuf,MAX_PACKET_SIZE);
					if(nRecvLen >0)
					{
						szRecvBuf[nRecvLen] ='\0';
						HandleDeliverMsg(pstDeliverNodeBuf,pstClientNodeBuf,szRecvBuf,nRecvLen);
						//LogMsg(szRecvBuf,1);
					}
				}
				m_pSection[i].Unlock();
			}

			HandleActiveTest();
//			LogMsg("Deliver Thread Active!") ;
			Sleep(10);
		}
		else
		{
			ConnectDB();
			Sleep(1000);
		}
	}

    m_database.Close();
	Quit();
	return 0;
}

void CDeliverThread::LoadCmdGameQuit()
{
    CSqlExec sql_get(&m_database) ;
    CString  strSql,strMsg;

	strSql.Format("SELECT * FROM gr_Cmd_GameQuit order by srccmd ");
	sql_get.SetSqlStatement(strSql);
	if( !sql_get.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		LogFile(strMsg);
		return;
	}
	sql_get.FetchAllData();

	m_nGameQuitNum = sql_get.RowCount();

	if(m_sGameQuit != NULL)
	{
		delete [] m_sGameQuit;
		m_sGameQuit  = NULL;
	}

	m_sGameQuit = new SGameQuit[m_nGameQuitNum];

	for(int row=0; row<m_nGameQuitNum;row++) 
	{
		m_sGameQuit[row].strSrcCmd     = TrimStr(sql_get.GetFieldValue(row,"SrcCmd"));
        m_sGameQuit[row].strSrcCmd.MakeUpper();
		m_sGameQuit[row].strGameName   = TrimStr(sql_get.GetFieldValue(row,"GameName"));
		m_sGameQuit[row].strMessage    = TrimStr(sql_get.GetFieldValue(row,"message"));
		m_sGameQuit[row].strGameSQL    = TrimStr(sql_get.GetFieldValue(row,"GameSQL"));
		m_sGameQuit[row].strQuitSQL    = TrimStr(sql_get.GetFieldValue(row,"QuitSQL"));
	}

}

void CDeliverThread::LoadCmdTab()
{
    CSqlExec sql_get(&m_database) ;
    CString  strSql,strMsg;

	strSql.Format("SELECT * FROM gr_Cmd_MoTab ORDER BY OrdIndex, SenderType DESC, MatchType DESC ");
	sql_get.SetSqlStatement( strSql );
	if( !sql_get.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		LogFile(strMsg);
		return;
	}
	sql_get.FetchAllData();

	m_nNumOfGameCmd = sql_get.RowCount();
	if(m_astCmdTab != NULL)
	{
		delete [] m_astCmdTab;
		m_astCmdTab = NULL;
	}

	m_astCmdTab = new SCmdTable[m_nNumOfGameCmd];

	for(int row=0; row<m_nNumOfGameCmd;row++) 
	{
		m_astCmdTab[row].strCmd=TrimStr(sql_get.GetFieldValue(row,"Cmd"));
		m_astCmdTab[row].iMatchType=atoi(sql_get.GetFieldValue(row,"MatchType"));
		m_astCmdTab[row].iMoTabNum=atoi(sql_get.GetFieldValue(row,"MoTabNum"));
		m_astCmdTab[row].strCmd.MakeUpper();
		m_astCmdTab[row].strMoTab=TrimStr(sql_get.GetFieldValue(row,"MoTabName"));
		m_astCmdTab[row].strSender=TrimStr(sql_get.GetFieldValue(row,"Sender"));
		m_astCmdTab[row].iSenderType=atoi(sql_get.GetFieldValue(row,"SenderType"));
	}
}

void CDeliverThread::SubmitToTable(const char *szMsg, const char *szSAddr, const char *szDAddr,const char *szLinkID, const char *szTable)
{
	CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _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;
	strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid) \
					   values('%s','%s','%s','%s')",szTable,szMsg,strSAddr,strDAddr,szLinkID);
	sql_deliver.SetSqlStatement(strSql);

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

void CDeliverThread::SubmitToMonthTable(const char *szMsg, const char *szSAddr, const char *szDAddr,const char *szLinkID, const char *szTable)
{
	CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _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;
	
	strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid,tablename) \
		           values('%s','%s','%s','%s','%s')",m_szMonthTable,szMsg,strSAddr,strDAddr,szLinkID,szTable);
	sql_deliver.SetSqlStatement(strSql);

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

void CDeliverThread::SubmitToSend(const char *szMsg, const char *szSAddr, const char *szDAddr,const char *szLinkID,BOOL bCancle)
{
    CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _strSAddr = szSAddr;
	_strDAddr = szDAddr;
//8686008600  868188 8188
	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 (bCancle)
	{
    strSql.Format("insert into %s(message,mobile,sender,linkid,servicetype,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%d','%d','%d','%d')",
				   m_szTableName,
				   szMsg,
				   strSAddr,
				   strDAddr,
				   szLinkID,
				   m_canclefee.strServiceType,
				   m_canclefee.iFeeType,
				   m_canclefee.iFeeValue,
				   m_canclefee.iGivenValue,
				   m_canclefee.iMotomtFlag);
	}
	else
	{
	strSql.Format("insert into %s(message,mobile,sender,linkid,servicetype,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%d','%d','%d','%d')",
				   m_szTableName,
				   szMsg,
				   strSAddr,
				   strDAddr,
				   szLinkID,
				   m_deffee.strServiceType,
				   m_deffee.iFeeType,
				   m_deffee.iFeeValue,
				   m_deffee.iGivenValue,
				   m_deffee.iMotomtFlag);
	}

	sql_deliver.SetSqlStatement(strSql);

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

// add by ycf 20020825
BOOL CDeliverThread::IsEnableMobile(const char *szSAddr)//号码段控制
{ //判断是否是本地区的有效号码段
	CString strMobileHead ,strMobile;
	BOOL bResult = -1 ;

	strMobile = szSAddr ;
	strMobile.TrimLeft();
	strMobile.TrimRight();

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

    //判断离散零星号码表
	bResult = IsScrapMobile(strMobileHead) ;//查询零散号码表
	if(bResult != -1)//-1,表示零散号码表为空
	    return bResult ;

    //判断连续号码控制表
	if(m_bMbCtrlFlag)
	{//1,判断号码区间段(11位数)
		bResult = IsConsecutiveMobile(strMobileHead) ;//(包括有效和无效两种)
		if(bResult != -1)//-1,表示号码区间段表为空
			return bResult ;
	}
	else{//判断号码头表
		bResult = IsMobileHead(strMobileHead) ;//(包括有效和无效两种)
		if(bResult != -1)//-1,表示号码头表为空
			return bResult ;
	}
		
	return TRUE ;
}


BOOL CDeliverThread::IsMobileHead(CString strMobile)
{//返回值: 1,有效号码;0,无效号码 宋璟(2002-8-29)
	int nMax, nMin, nIndex, nHeadLength;
	CString strHead ;

	//先在无效号码表中查找
	nMin = 0 ;
	nMax = m_saInvdMbHead.GetSize() ;

	if(nMax > 0)
	{
		while(nMin <= nMax)
		{
			nIndex = (nMin + nMax) / 2 ;
			nHeadLength = m_saInvdMbHead.GetAt( nIndex ).GetLength() ;
			strHead = strMobile.Left(nHeadLength) ;

			if (strHead < m_saInvdMbHead.GetAt( nIndex ))
				nMax = nIndex - 1 ;
			else
			if (strHead > m_saInvdMbHead.GetAt( nIndex ))
			{
				nMin = nIndex + 1 ;
				if(nMin == m_saInvdMbHead.GetSize())
					nMin = nMax + 1 ;
			}
			else
				return FALSE ;
		}

		return TRUE ;//无效号码表中未找到
	}
	//当无效号码表为空时,就在有效号码表中查找

	nMin = 0 ;
	nMax = m_saValidMbHead.GetSize() ;

	if(nMax > 0)
	{
		while(nMin <= nMax)
		{
			nIndex = ( nMin + nMax ) / 2 ;
			nHeadLength = m_saValidMbHead.GetAt( nIndex ).GetLength() ;
			strHead = strMobile.Left( nHeadLength ) ;

			if(strHead < m_saValidMbHead.GetAt( nIndex ) )
				nMax = nIndex - 1 ;
			else
			if (strHead > m_saValidMbHead.GetAt( nIndex ))
			{
				nMin = nIndex + 1 ;
				if(nMin == m_saValidMbHead.GetSize())
					nMin = nMax + 1 ;
			}
			else
				return TRUE ;
		}
	}
	else
		return TRUE ;//有效号码表和无效号码表都为空

	return FALSE ;//有效号码表中未找到
}


BOOL CDeliverThread::IsScrapMobile(CString strMobile)
{//返回值: 1,有效号码;0,无效号码; -1,没有找到或表空  宋璟(2002-8-29)
	int nMax, nMin, nIndex;
	
	//先在无效号码表中查找
	nMin = 0 ;
	nMax = m_nInvdScrapMbCount ;

	if(nMax > 0 )
	{
		while(nMin <= nMax)
		{
			nIndex = (nMin + nMax) / 2 ;
			if(strMobile < m_psInvdScrapMb[ nIndex ].strStart )
				nMax = nIndex - 1 ;
			else
			if (strMobile > m_psInvdScrapMb[ nIndex ].strStart)
			{
				nMin = nIndex + 1 ;
				if(nMin == m_nInvdScrapMbCount)
					nMin = nMax + 1 ;
			}
			else
				return FALSE ;
		}
	}

	//当无效号码表为空或没有找到时,就在有效号码表中查找

	nMin = 0 ;
	nMax = m_nValidScrapMbCount ;
	if(nMax > 0)
	{
		while(nMin <= nMax)
		{
			nIndex = (nMin + nMax) / 2 ;
			if(strMobile < m_psValidScrapMb[ nIndex ].strStart )
				nMax = nIndex - 1 ;
			else
			if (strMobile > m_psValidScrapMb[ nIndex ].strStart)
			{
				nMin = nIndex + 1 ;
				if(nMin == m_nValidScrapMbCount)
					nMin = nMax + 1 ;
			}
			else
				return TRUE ;
		}
	}	

	return -1 ;//当无效号码表为空或没有找到时
	//当有效号码表为空或没有找到时
}


BOOL CDeliverThread::IsConsecutiveMobile(CString strMobile)
{
	int		i ;

	if((m_nValidMbCount <= 0)
		&& (m_nValidMbCount <= 0))
			return -1 ;

	for( i = 0 ; i < m_nInvalidMbCount ; i++ )
	{
		if( ( m_psInvalidMb[ i ].strStart <= strMobile ) && 
			( strMobile <= m_psInvalidMb[ i ].strEnd ) )
			return FALSE ;
	}
	if(m_nInvalidMbCount > 1 )

⌨️ 快捷键说明

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