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

📄 serverthread.cpp

📁 vc开发的一个cmpp(中国移动点对点通讯)通讯程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ServerThread.cpp : implementation file
//

#include "stdafx.h"
#include "cmpp.h"
#include "ServerThread.h"
//#include "define.h"
#include "tcpsocket.h"
#include ".\\odbcapi\\sqlexec.h"
#include <process.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CServerThread

IMPLEMENT_DYNCREATE(CServerThread, CWinThread)

extern char CMPP_INI_FILE[100];           //配置信息
extern CArray <SServerNodeBuffer*,SServerNodeBuffer*>  m_stServerNodeBuf;
extern SESSION_ITEM	m_stTask[MAX_TASK_SIZE];
extern int				m_nTaskHead;
extern int				m_nTaskTail;


CServerThread::CServerThread()
{
	m_nTaskHead = 0;
	m_nTaskTail = 0;
	m_bConnectToDB    =false;
	m_bCustomSpNumber =false;
	m_sFiltrateMsg    = NULL;
    m_pstrFreeUser    = NULL;
}

CServerThread::~CServerThread()
{
}
void AcceptMoniterProc(void* pParam)
{
	CServerThread* pstThread=(CServerThread*)pParam;
	SOCKADDR saClient;
	CTcpAsyncSocket* pstAcceptSocket;

	try 
	{
		pstAcceptSocket = new CTcpAsyncSocket();
		if(!pstThread->m_stMoniterSocket.Accept(*pstAcceptSocket,&saClient))
		{
			delete pstAcceptSocket;
			_endthread();
		}
		pstThread->AddToMoniterList(pstAcceptSocket);
		_beginthread(AcceptMoniterProc,0,pParam);		//get ready for another connection
	}
	catch(const char* e)
	{
		printf("%s\n",e);
		delete pstAcceptSocket;
	}
	_endthread();
}

BOOL CServerThread::InitInstance()
{
	BOOL	bTrue	= true ;
	
	LoadIni() ;
	
	while(bTrue && !g_bServerThreadExit)
	{
		if(ConnectDB())
		{
			bTrue = false;
		}
		else
		{
			Sleep(500);
		}
	}

	if (m_bFiltrate)         // 开启功能
		LoadFiltrateMsg();

	if (m_bFreeUser)         //开启免费用户
		LoadFreeUser();

	return TRUE;
}

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

 void CServerThread::LoadIni()
{
	CString  strField;
	char szServiceType[20];
	SHORT_MESSAGE_SPLIT_LENGTH = 70;

	GetPrivateProfileString("系统","数据源","DSN=sm;UID=sa;PWD=",m_szDSN,100,CMPP_INI_FILE);

	m_nPriority=GetPrivateProfileInt("系统","短消息发送优先级",9,CMPP_INI_FILE);
	m_nExpireSpan=GetPrivateProfileInt("系统","短消息有效期限(秒)",0,CMPP_INI_FILE);
	
	m_nQuerRecordTimes = GetPrivateProfileInt("系统","查询记录时间间隔",50,CMPP_INI_FILE);
	m_nMaxRetryTimes = GetPrivateProfileInt("系统","重发最多重试次数",5,CMPP_INI_FILE);
	m_nWaitAnsTimes = GetPrivateProfileInt("系统","等待应答时间",30,CMPP_INI_FILE);

	m_nMaxIdleTimes = GetPrivateProfileInt("系统","MT最大空闲时间",60,CMPP_INI_FILE);
	m_nContinueSendTimes =  GetPrivateProfileInt("系统","连续发送时间间隔",50,CMPP_INI_FILE);
	m_nContinueSendCount=GetPrivateProfileInt("系统","连续发送条数",50,CMPP_INI_FILE);

	if(m_nContinueSendCount>200 || m_nContinueSendCount< 10) m_nContinueSendCount=50;

	m_nTotalServer =  GetPrivateProfileInt("系统","短信服务器开启个数",1,CMPP_INI_FILE);
	m_nSourceNode =  GetPrivateProfileInt("系统","源节点编号",367188,CMPP_INI_FILE);
	GetPrivateProfileString("系统","SP接入号码","8788",m_szSPNumber,21,CMPP_INI_FILE);
	GetPrivateProfileString("系统","企业代码","67188",m_szCorpId,21,CMPP_INI_FILE);
	
	GetPrivateProfileString("系统","MT发送表名","gr_sendmessage",m_szTableName,50,CMPP_INI_FILE);
	GetPrivateProfileString("系统","程序正常标志文件名","sgip2002.pid",m_szActiveFlag,50,CMPP_INI_FILE);
	
	GetPrivateProfileString("系统","MT发送日志表名","gr_sendmessage_log",m_szSubmitLogTableName,100,CMPP_INI_FILE);
	m_bSubmitLogToEveryDayTable=GetPrivateProfileInt("系统","MT是否每天一个日志表记录",0,CMPP_INI_FILE);
	m_bCustomSpNumber=GetPrivateProfileInt("系统","是否自定义发送人",0,CMPP_INI_FILE);
    
	m_overfee.iFeeType=GetPrivateProfileInt("系统","超长计费类别",2,CMPP_INI_FILE);
	m_overfee.iMotomtFlag=GetPrivateProfileInt("系统","超长MOTOMTFLAG",0,CMPP_INI_FILE);
	m_overfee.iFeeValue=GetPrivateProfileInt("系统","超长信息费",10,CMPP_INI_FILE);
	m_overfee.iGivenValue=GetPrivateProfileInt("系统","超长赠话费",0,CMPP_INI_FILE);
	GetPrivateProfileString("系统","超长业务代码","",szServiceType,20,CMPP_INI_FILE);
    m_overfee.strServiceType.Format("%s",szServiceType);


	m_bFiltrate = GetPrivateProfileInt("系统","开启过滤功能",0,CMPP_INI_FILE);
	m_nFilType  = GetPrivateProfileInt("系统","过滤类别",0,CMPP_INI_FILE);
    m_nRptMsgFlag = GetPrivateProfileInt("系统","RptMsgID",0,CMPP_INI_FILE);

	
	m_bFreeUser = GetPrivateProfileInt("系统","开启免费用户",0,CMPP_INI_FILE);
	m_freefee.iFeeType=GetPrivateProfileInt("系统","免费计费类别",1,CMPP_INI_FILE);
	m_freefee.iMotomtFlag=GetPrivateProfileInt("系统","免费MOTOMTFLAG",3,CMPP_INI_FILE);
	m_freefee.iFeeValue=GetPrivateProfileInt("系统","免费信息费",0,CMPP_INI_FILE);
	m_freefee.iGivenValue=GetPrivateProfileInt("系统","免费赠话费",0,CMPP_INI_FILE);


    GetPrivateProfileString("系统","免费业务代码","pet",szServiceType,20,CMPP_INI_FILE);
    m_freefee.strServiceType.Format("%s",szServiceType);
	g_bServerThreadExit=false;
	m_stPdu.InitData(m_szSPNumber,m_szCorpId);

}

BOOL CServerThread::ConnectDB()
{
	try
	{
		m_database.OpenEx(m_szDSN,CDatabase::noOdbcDialog);
		m_bConnectToDB=TRUE;
	}
    catch( CDBException* e )
	{
		LogMsg(e->m_strError);
		LogMsg("连接MT数据库失败!");
		m_bConnectToDB=FALSE;
		return FALSE;
	}
	LogMsg("连接MT数据库成功!");
	return TRUE;

}

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

	while(!g_bServerThreadExit)
	{
		if(m_bConnectToDB)
		{
			HandleTask();
			QueryRecord();
			HandleActiveTest();	
			Sleep(50);
		}
	}
	m_database.Close();
	Quit();
	return 0;
	
}

void CServerThread::QueryRecord()
{
	CSqlExec		sql_sm(&m_database),sql_delete(&m_database),sql_Log(&m_database);
	DWORD			tCurTime;
	static DWORD	tLastTime=GetTickCount();
	double			lDiffTime;
	CString			strID,strMessage,strSender,strMobile,strShortMsg,strSql,strFlash;
	CString			strServiceType,strFeeValue,strGivenValue,strMSQL,strMsg,strMsgType,strLinkID,strLastMobile;
	char			cFeeType;
	int				nRet,nMOtoMTFlag;
	CString			strChargeNumber,strReBack;
	int 			iStatusRpt=0,iDataEnCode=15;
	BOOL            bFeedBack=false;
	int	iMobileType,iFeeNumType;
	CString         strIdFirst,strIdLast;//记录开始和结束短信id,用于删除;luming add 20041228
	
	    //没有可用的连接
	if(GetMinUnHandleServerIndex()<0)	return;

	tCurTime=GetTickCount();
	lDiffTime = tCurTime-tLastTime-m_nQuerRecordTimes;
	
	if (lDiffTime < 0)
		return;
	tLastTime = tCurTime;
	strSql.Format("select top %d * from %s order by priority asc,id ",m_nContinueSendCount,m_szTableName); 
	sql_sm.SetSqlStatement(strSql);
	if(!sql_sm.Open())
	{
		strMessage.Format("执行SQL语句发生错误:%s",strSql);
		LogMsg(strMessage);
		m_bConnectToDB=FALSE;
		ACTIVE_FLAG = false;
		return;
	}
    
	//写程序正常标志
    WriteActiveFlag();

	sql_sm.FetchAllData();
	iMobileType =0;
	iFeeNumType=0;

	for(int row=0;row <= sql_sm.RowCount()-1;row++)
	{
		strID       = TrimStr(sql_sm.GetFieldValue(row,"id"));
		strMessage  = TrimStr(sql_sm.GetFieldValue(row,"message"));
		strSender   = TrimStr(sql_sm.GetFieldValue(row,"sender"));
		strMobile   = TrimStr(sql_sm.GetFieldValue(row,"mobile"));
		strServiceType  = TrimStr(sql_sm.GetFieldValue(row,"servicetype"));
		strLinkID  = TrimStr(sql_sm.GetFieldValue(row,"linkid"));
		cFeeType = atoi(sql_sm.GetFieldValue(row,"feetype"));
		strFeeValue = TrimStr(sql_sm.GetFieldValue(row,"feevalue"));
		strGivenValue = TrimStr(sql_sm.GetFieldValue(row,"givenvalue"));
		nMOtoMTFlag = atoi(sql_sm.GetFieldValue(row,"motomtflag"));
		strMsgType= TrimStr(sql_sm.GetFieldValue(row,"MsgType"));
		strChargeNumber= TrimStr(sql_sm.GetFieldValue(row,"FeeNum"));
		iStatusRpt  =atoi(sql_sm.GetFieldValue(row,"statusrpt"));
		iDataEnCode =atoi(sql_sm.GetFieldValue(row,"DataEnCode")); 
//		iMobileType  =atoi(sql_sm.GetFieldValue(row,"mobiletype"));
		iFeeNumType =atoi(sql_sm.GetFieldValue(row,"feenumtype"));
		//luming mod 2004-03-20

		if(row==0)//luming add 取第一条短信ID
		{
			strIdFirst =strID;
		}
		strIdLast =strID;//取最后一条短信记录;

		//if(strMobile.CompareNoCase(strLastMobile) == 0)//luming mod 20041230 因为现在是删除一批所以不能跳过
			//continue;
		//strLastMobile = strMobile;

		if(m_bCustomSpNumber)
		{
			if(strSender.Find(m_szSPNumber))//自定义的发送人没有以特服号开头
			{
				strSender=m_szSPNumber;
			}
			else
			{
				strSender=strSender.Left(21);	
			}
		}
		else
		{
			strSender=m_szSPNumber;	 //不定义发送人		
		}

		if(strMobile.GetLength()==11 ||(strMobile.GetLength()==13 && strMobile.Left(2)=="86"))
		{
			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" )		//短信
			{
				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) 
				{
					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,iMobileType,iFeeNumType);
							 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,iMobileType,iFeeNumType);   
							if (nRet == -1)
								break;
						}
					}

				}
			}
		}
		else
		{
			printf("非法手机号:%s",strMobile);
		}
	}

	if(strIdFirst.GetLength() >0)//luming mod 20041229
	{
		CString strTmp;
		strSql.Format("DELETE FROM %s WHERE id>=%s AND id<=%s",m_szTableName,strIdFirst,strIdLast);//luming mod 20041228
		LogMsg(strSql);
		sql_delete.SetSqlStatement(strSql);
		try
		{
			if(!sql_delete.Open())
			{
				return;		
			}
		}
		catch(CDBException * e)
		{
			strTmp.Format("执行%s失败!",strSql);
			LogMsg(strTmp);
		}
	}
}

BOOL CServerThread::IsFreeUser(CString strMobile)
{
    BOOL    bFree = false;

	for (int i=0;i<m_nFreeUserNum;i++)
	{
		if (m_pstrFreeUser[i].CompareNoCase(strMobile) == 0)
		{
			bFree = true;

⌨️ 快捷键说明

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