📄 server.cpp
字号:
// ISMGServer.cpp : implementation file
//
#include "stdafx.h"
#include <process.h>
#include "Server.h"
#include "tcpsocket.h"
#include "sqlexec.h"
#include "sgippdu.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CServerThread
BOOL g_bExit = false;
BOOL g_bConnect = false;
extern char SGIP_INI_FILE[100]; //配置文件
extern int SHORT_MESSAGE_SPLIT_LENGTH; //拆分长度
extern bool ACTIVE_FLAG;
//11.27 14:28 修改///////////////////////////////////
///////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CServerThread, CWinThread)
void WriteServerActiveFlag(const char* szActiveFileName)
{
static tOldTime=time(NULL);
time_t tCurTime;
double lDiffTime;
time(&tCurTime);
lDiffTime = abs(difftime(tCurTime , tOldTime)) - 20;
if (lDiffTime > 0 )
{
TRY
{
CFile f( szActiveFileName, CFile::modeCreate | CFile::modeWrite );
f.Close();
}
CATCH( CFileException, e )
{
CString strMsg;
strMsg.Format("文件%s不能被创建.",szActiveFileName);
LogFile(strMsg);
}
END_CATCH
tOldTime = tCurTime;
}
}
CServerThread::CServerThread()
{
m_bAutoDelete = false;
g_bExit = false;
bLongMessageFree=false;
m_nTaskHead = 0;
m_nTaskTail = 0;
pPictureType=NULL;
m_bConnectToDB =false;
m_bCustomSpNumber =false;
m_sFiltrateMsg = NULL;
pPictureType = NULL;
m_pstrFreeUser = NULL;
}
CServerThread::~CServerThread()
{
if(pPictureType)
{
delete[] pPictureType;
pPictureType = NULL;
}
if(m_sFiltrateMsg != NULL)
{
delete [] m_sFiltrateMsg;
m_sFiltrateMsg = NULL;
}
if(m_pstrFreeUser != NULL)
{
delete [] m_pstrFreeUser;
m_pstrFreeUser = NULL;
}
}
int CServerThread::SeekTask(int nSequence1,int nSequence2,int nSequence3)
{
int head = m_nTaskHead;
while(head != m_nTaskTail)
{
if(m_stTask[head].m_iSequenceNumber1 == nSequence1 && m_stTask[head].m_iSequenceNumber2 == nSequence2 &&
m_stTask[head].m_iSequenceNumber3 == nSequence3 )
return head;
head = (head +1) % MAX_TASK_SIZE;
}
return -1;
}
void CServerThread::ProcessIdle()
{
while(m_nTaskHead != m_nTaskTail)
{
if(m_stTask[m_nTaskHead].m_bState == S_IDLE)
m_nTaskHead = (m_nTaskHead +1) % MAX_TASK_SIZE;
else
break;
}
}
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;
}
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::LoadIni()
{
CString strField;
SServerNodeBuffer *pstNodeBuf;
char szServiceType[20],szMobileType[100];
bLongMessageFree= GetPrivateProfileInt("系统","超长处理情况",0,SGIP_INI_FILE);
m_nMoniterPort=GetPrivateProfileInt("系统","MT监控端口",6999,SGIP_INI_FILE);
GetPrivateProfileString("系统","系统用户名","land",m_szUserName,20,SGIP_INI_FILE);
GetPrivateProfileString("系统","系统密码","land",m_szPassword,20,SGIP_INI_FILE);
GetPrivateProfileString("系统","数据源","DSN=sm;UID=sa;PWD=",m_szDSN,100,SGIP_INI_FILE);
m_nPriority=GetPrivateProfileInt("系统","短消息发送优先级",9,SGIP_INI_FILE);
m_nExpireSpan=GetPrivateProfileInt("系统","短消息有效期限(秒)",0,SGIP_INI_FILE);
m_nQuerRecordTimes = GetPrivateProfileInt("系统","查询记录时间间隔",50,SGIP_INI_FILE);
m_nMaxRetryTimes = GetPrivateProfileInt("系统","重发最多重试次数",5,SGIP_INI_FILE);
m_nWaitAnsTimes = GetPrivateProfileInt("系统","等待应答时间",30,SGIP_INI_FILE);
m_nMaxIdleTimes = GetPrivateProfileInt("系统","MT最大空闲时间",60,SGIP_INI_FILE);
m_nContinueSendTimes = GetPrivateProfileInt("系统","连续发送时间间隔",50,SGIP_INI_FILE);
m_nContinueSendCount=GetPrivateProfileInt("系统","连续发送条数",50,SGIP_INI_FILE);
if(m_nContinueSendCount>200 || m_nContinueSendCount< 10) m_nContinueSendCount=50;
m_nTotalServer = GetPrivateProfileInt("系统","MT短信服务器开启个数",1,SGIP_INI_FILE);
m_nSourceNode = GetPrivateProfileInt("系统","源节点编号",367188,SGIP_INI_FILE);
GetPrivateProfileString("系统","SP接入号码","8788",m_szSPNumber,21,SGIP_INI_FILE);
GetPrivateProfileString("系统","企业代码","67188",m_szCorpId,21,SGIP_INI_FILE);
GetPrivateProfileString("系统","MT发送表名","gr_sendmessage",m_szTableName,50,SGIP_INI_FILE);
GetPrivateProfileString("系统","程序正常标志文件名","sgip2002.pid",m_szActiveFlag,50,SGIP_INI_FILE);
GetPrivateProfileString("系统","MT发送日志表名","gr_sendmessage_log",m_szSubmitLogTableName,100,SGIP_INI_FILE);
m_bSubmitLogToEveryDayTable=GetPrivateProfileInt("系统","MT是否每天一个日志表记录",0,SGIP_INI_FILE);
m_bCustomSpNumber=GetPrivateProfileInt("系统","是否自定义发送人",0,SGIP_INI_FILE);
m_overfee.iFeeType=GetPrivateProfileInt("系统","超长计费类别",2,SGIP_INI_FILE);
m_overfee.iMotomtFlag=GetPrivateProfileInt("系统","超长MOTOMTFLAG",0,SGIP_INI_FILE);
m_overfee.iFeeValue=GetPrivateProfileInt("系统","超长信息费",10,SGIP_INI_FILE);
m_overfee.iGivenValue=GetPrivateProfileInt("系统","超长赠话费",0,SGIP_INI_FILE);
GetPrivateProfileString("系统","超长业务代码","",szServiceType,20,SGIP_INI_FILE);
m_overfee.strServiceType.Format("%s",szServiceType);
m_stPdu.InitData(m_nSourceNode,m_szSPNumber,m_szCorpId);
for(int i=0;i<m_nTotalServer;i++)
{
pstNodeBuf = new SServerNodeBuffer;
strField.Format("MT短信服务器%d",i+1);
GetPrivateProfileString(strField,"服务器地址","",pstNodeBuf->m_szServerIP,100,SGIP_INI_FILE);
pstNodeBuf->m_nServerPort = GetPrivateProfileInt(strField,"服务器端口",6300,SGIP_INI_FILE);
GetPrivateProfileString(strField,"用户名","CJXH",pstNodeBuf->m_szUser,20,SGIP_INI_FILE);
GetPrivateProfileString(strField,"密码","",pstNodeBuf->m_szPassword,20,SGIP_INI_FILE);
GetPrivateProfileString(strField,"本地地址","",pstNodeBuf->m_szLocalIP,20,SGIP_INI_FILE);
pstNodeBuf->m_bConnected = false;
pstNodeBuf->m_nUnHandleNumber = 0;
m_stServerNodeBuf.Add(pstNodeBuf);
}
iMobileTypeNum=GetPrivateProfileInt("系统","支持手机种类",1,SGIP_INI_FILE);
pPictureType=new PICTURETYPE[iMobileTypeNum];
for (i=0;i<iMobileTypeNum;i++)
{
strField.Format("手机类型%d",i+1);
pPictureType[i].iTP_pid=GetPrivateProfileInt(strField,"TP_pid",0,SGIP_INI_FILE);
pPictureType[i].iTP_udhi=GetPrivateProfileInt(strField,"TP_udhi",64,SGIP_INI_FILE);
GetPrivateProfileString(strField,"名称","未知",szMobileType,100,SGIP_INI_FILE);
pPictureType[i].strMobileType.Format("%s",szMobileType);
}
m_bFiltrate = GetPrivateProfileInt("系统","开启过滤功能",0,SGIP_INI_FILE);
m_nFilType = GetPrivateProfileInt("系统","过滤类别",0,SGIP_INI_FILE);
//------------------------------------------------------
m_tplsfee.iFeeType=GetPrivateProfileInt("系统","图片铃声计费类别",1,SGIP_INI_FILE);
m_tplsfee.iMotomtFlag=GetPrivateProfileInt("系统","图片铃声MOTOMTFLAG",3,SGIP_INI_FILE);
m_tplsfee.iFeeValue=GetPrivateProfileInt("系统","图片铃声信息费",0,SGIP_INI_FILE);
m_tplsfee.iGivenValue=GetPrivateProfileInt("系统","图片铃声赠话费",0,SGIP_INI_FILE);
m_bFreeUser = GetPrivateProfileInt("系统","开启免费用户",0,SGIP_INI_FILE);
m_freefee.iFeeType=GetPrivateProfileInt("系统","免费计费类别",1,SGIP_INI_FILE);
m_freefee.iMotomtFlag=GetPrivateProfileInt("系统","免费MOTOMTFLAG",3,SGIP_INI_FILE);
m_freefee.iFeeValue=GetPrivateProfileInt("系统","免费信息费",0,SGIP_INI_FILE);
m_freefee.iGivenValue=GetPrivateProfileInt("系统","免费赠话费",0,SGIP_INI_FILE);
GetPrivateProfileString("系统","免费业务代码","pet",szServiceType,20,SGIP_INI_FILE);
m_freefee.strServiceType.Format("%s",szServiceType);
}
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_bExit)
{
if(ConnectDB())
{
bTrue = false;
}
else
{
Sleep(500);
}
}
if (m_bFiltrate) // 开启功能
LoadFiltrateMsg();
if (m_bFreeUser) //开启免费用户
LoadFreeUser();
return TRUE;
}
BOOL CServerThread::InitSocket()
{
SServerNodeBuffer *pstNode;
m_stMoniterSocket.Close();
m_stMoniterSocket.Create(m_nMoniterPort);
m_stMoniterSocket.SetNonBlockingMode(false);
m_stMoniterSocket.Listen();
_beginthread(AcceptMoniterProc,0,this);
//start connect to SMG
for(int i=0;i<m_stServerNodeBuf.GetSize();i++)
{
pstNode =(SServerNodeBuffer *)m_stServerNodeBuf.GetAt(i);
if(ConnectServer(pstNode))
SendSGipBind(pstNode);
}
return TRUE;
}
BOOL CServerThread::ConnectServer(SServerNodeBuffer *pstNode)
{
CString strMsg;
pstNode->m_stSocket.Close();
CString str ;
str=pstNode->m_szLocalIP ;
if(str.GetLength()==0)
{
pstNode->m_stSocket.Create(0,SOCK_STREAM);
}
else
{
pstNode->m_stSocket.Create(0,SOCK_STREAM,pstNode->m_szLocalIP);
}
pstNode->m_bConnected = false;
pstNode->m_stSocket.SetNonBlockingMode(false);
if(pstNode->m_stSocket.Connect(pstNode->m_szServerIP,pstNode->m_nServerPort))
{
strMsg.Format("连接到服务器%s,端口%d成功。",pstNode->m_szServerIP,pstNode->m_nServerPort);
LogMsg(strMsg);
}
else
{
int nError = GetLastError();
strMsg.Format("连接到服务器%s,端口%d失败。",pstNode->m_szServerIP,pstNode->m_nServerPort);
LogMsg(strMsg);
LogFile(strMsg);
time(&pstNode->m_tConnectServerTime);
time(&pstNode->m_tServerActiveTime);
return false;
}
pstNode->m_stSocket.SetNonBlockingMode(true);
time(&pstNode->m_tConnectServerTime);
time(&pstNode->m_tServerActiveTime);
return true;
}
int CServerThread::SendSGipUnBind(SServerNodeBuffer *pstNode)
{
LogMsg("[MT]发送UnBind包给SMG.");
m_stPdu.UnBind();
if(SendPacket(&pstNode->m_stSocket,m_stPdu.GetBuffer(),m_stPdu.GetLen()) >0)
{ //wait bindresp
time_t tOldTime,tCurTime;
char szRecvBuf[MAX_PACKET_SIZE +1];
int nRecvLen;
tOldTime = time(NULL);
while(1)
{
nRecvLen = ReceivePdu(&pstNode->m_stSocket,szRecvBuf,MAX_PACKET_SIZE);
if(nRecvLen >0)
{ //收到服务器应答信息
szRecvBuf[nRecvLen] ='\0';
HandleServerMsg(pstNode,szRecvBuf,nRecvLen);
return 1;
}
Sleep(10);
time(&tCurTime);
if(difftime(tCurTime,tOldTime) > 3)
return 0;
}
}
return 0;
}
int CServerThread::SendSGipUnBindResp(SServerNodeBuffer *pstNode,const char* szRecvBuf)
{
m_stPdu.UnBindResp(szRecvBuf);
return SendPacket(&pstNode->m_stSocket,m_stPdu.GetBuffer(),m_stPdu.GetLen());
}
int CServerThread::SendSGipBind(SServerNodeBuffer *pstNode)
{
//SendSGipUnBind(pstNode);
m_stPdu.Bind(BINDTYPE_SP_CONNECT_TO_SMG,pstNode->m_szUser,pstNode->m_szPassword);
return SendPacket(&pstNode->m_stSocket,m_stPdu.GetBuffer(),m_stPdu.GetLen());
}
int CServerThread::SendShortMessage(const char* szUserNumber,const char* szMessageContent,const char* szChargeNumber,
const char* szSender,const char* szServiceType,const char *szLinkID,char cFeeType,const char *szFeeValue,const char* szGivenValue,
const char* szScheduleTime,char cMessageCoding,char cMOrelatetoMTFlag,int iStatusRpt,int iPriority,int iMsgType,int iExpireTimeSpan)
{
SServerNodeBuffer *pstServerNodeBuf;
char szMobile[200],szFeeNum[200],szMsg[2048];
CString strMsgID,strSql;
// if(strlen(szUserNumber)<11)
// return -1;
int index = GetMinUnHandleServerIndex();
if(index > -1)
{
/* if(szUserNumber[0] =='1')
{
strcpy(szMobile,"86");
strcat(szMobile,szUserNumber);
}
else
{
strcpy(szMobile,szUserNumber);
}
if(strlen(szChargeNumber) !=0)
{
if(szChargeNumber[0] =='1')
{
strcpy(szFeeNum,"86");
strcat(szFeeNum,szChargeNumber);
}
else
{
strcpy(szFeeNum,szChargeNumber);
}
}
else
strcpy(szFeeNum,""); */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -