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