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

📄 server.cpp

📁 一个用vc开发的Sgip通讯程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -