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

📄 mounitelistenwnd.cpp

📁 这个一个联通短信网关程序.并且在SP已经运行稳定.很有学习价值
💻 CPP
字号:
// moUniteListenWnd.cpp : implementation file
//

#include "stdafx.h"
#include "moUniteService.h"
#include "moUniteListenWnd.h"
//#include "../moservice/MOListenWnd.h"


UINT myConvert(UINT u){
	UINT uReturn = 0;
	byte b1 = (u&0xff000000)>>24;
	byte b2 = (u&0x00ff0000)>>16;
	byte b3 = (u&0x0000ff00)>>8;
	byte b4 = u&0x000000ff;
	uReturn |= b4<<24;
	uReturn |= b3<<16;
	uReturn |= b2<<8;
	uReturn |= b1;
	return uReturn;
}
static CADODatabase *mo_db=NULL;
// CmoUniteListenWnd
void SocketTraceMO(CString str){
#ifdef _DEBUG
	str+= "\r\n";
	CString strFilename = "c:\\UniteSocketmo.txt";	
	CFileStatus status;
	CTime time = CTime::GetCurrentTime();
	CString strTime;
	strTime.Format("*******%04d-%02d-%02d %02d:%02d:%02d ****",
		time.GetYear(),time.GetMonth(),time.GetDay(),
		time.GetHour(),time.GetMinute(),time.GetSecond());

	if(CFile::GetStatus(strFilename,status)){
		CFile f(strFilename,CFile::modeReadWrite|CFile::modeNoTruncate);
		f.SeekToEnd();
		f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
	else{
		CFile f(strFilename,CFile::modeCreate|CFile::modeWrite);
		f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
#endif
}
void UionLinkID(CString str){
#ifdef _DEBUG
	str+= "\r\n";
	CString strFilename = "c:\\UniteLinkIDMo.txt";	
	CFileStatus status;
	CTime time = CTime::GetCurrentTime();
	CString strTime;
	strTime.Format("*******%04d-%02d-%02d %02d:%02d:%02d ****",
		time.GetYear(),time.GetMonth(),time.GetDay(),
		time.GetHour(),time.GetMinute(),time.GetSecond());

	if(CFile::GetStatus(strFilename,status)){
		CFile f(strFilename,CFile::modeReadWrite|CFile::modeNoTruncate);
		f.SeekToEnd();
		f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
	else{
		CFile f(strFilename,CFile::modeCreate|CFile::modeWrite);
		f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
#endif
}
void MOMessageLog(CString str){
	//#ifdef _DEBUG
	//MOTrace("INPUT momessagelog");
	CString strFilename;
	CFileStatus status;
	try
	{
		str+= "\r\n";
		CString timelog;
		CTime timeS = CTime::GetCurrentTime();
		timelog.Format("联通%02d_%02dMO日志",
			timeS.GetMonth(),timeS.GetDay());
		timelog="d:\\"+timelog+".txt";
		strFilename =timelog;// "c:\\YDMOService.txt";	
	}catch (...) {
		SocketTraceMO("momessagelog ERROR");
	}
	CString strTime;
	CTime time = CTime::GetCurrentTime();
	strTime.Format("%04d-%02d-%02d %02d:%02d:%02d	",
		time.GetYear(),time.GetMonth(),time.GetDay(),
		time.GetHour(),time.GetMinute(),time.GetSecond());
	if(CFile::GetStatus(strFilename,status)){
		CFile f(strFilename,CFile::modeReadWrite|CFile::modeNoTruncate);
		f.SeekToEnd();
		//f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
	else{
		CFile f(strFilename,CFile::modeCreate|CFile::modeWrite);
		//f.Write(strTime.GetBuffer(0),strTime.GetLength());
		f.Write(str.GetBuffer(0),str.GetLength());
		f.Close();
	}
	//#endif
}
IMPLEMENT_DYNAMIC(CmoUniteListenWnd, CWnd)
CmoUniteListenWnd::CmoUniteListenWnd()
{
	m_pSocketMo=NULL;	
}

CmoUniteListenWnd::~CmoUniteListenWnd()
{
	Destory();
}
void CmoUniteListenWnd::Destory(){
	if(m_pSocketMo){
		m_pSocketMo->CloseAll();
		m_pSocketMo->Close();
		delete m_pSocketMo;
		m_pSocketMo = NULL;
	}
	if(mo_db){
		mo_db->Close();
		delete mo_db;
		mo_db=NULL;
	}
}

BEGIN_MESSAGE_MAP(CmoUniteListenWnd, CWnd)
	ON_MESSAGE(WM_SGIP_MO,OnSgipMO)
	ON_MESSAGE(WM_SGIP_REPORT,OnSGIPREPORT)
END_MESSAGE_MAP()

// CMOListenWnd message handlers
BOOL CmoUniteListenWnd::Create(CWnd * pMoParent){
	UionLinkID("input CmoUniteListenWnd Create");
	LPCTSTR lpAddress=NULL;
	CString strWndClass = ::AfxRegisterWndClass(0,NULL,NULL,NULL);
	BOOL BOK=CWnd::CreateEx(0,strWndClass,"SMSUniteListener",0,CRect(0,0,0,0),pMoParent,0,NULL);
	m_pSocketMo = new SocketMO(this);

	if("127.0.0.1"!=MyReg::GetClientPath())lpAddress=MyReg::GetClientPath();
	if(!m_pSocketMo->Create(MyReg::GetUnionMoPort())){
		Destory();
		return FALSE;
		SocketTraceMO("Socket create failed!");	
	}
	else
	{		
		if(!m_pSocketMo->Listen()){
			UionLinkID("!m_pSocketMo->Listen()");
			Destory();	
			return FALSE;
			SocketTraceMO("Socket listen failed!");
		}
		else
		{	UionLinkID("OpenSQLServerDirect");
			mo_db=new CADODatabase();
			mo_db->OpenSQLServerDirect(MyReg::GetDBIP(),MyReg::GetDBUserID(),MyReg::GetDBPassword(),MyReg::GetDBName());
			CString msgbox;		
			msgbox.Format("Socket created at Localhost and listening %d! ",MyReg::GetUnionMoPort());
			UionLinkID(msgbox);
			SocketTraceMO(msgbox);
			
		}	
	}
	
	return BOK;
}
//mo消息处理
HRESULT CmoUniteListenWnd::OnSgipMO(WPARAM wPar,LPARAM lPar)
{
	UionLinkID("input CmoUniteListenWnd OnSgipMO");
	SGIP_MO_MESSAGE *lpMoMsg=new SGIP_MO_MESSAGE();
	lpMoMsg=(LPSGIP_MO_MESSAGE)lPar;
	if(!lpMoMsg)return 0;
	if(strlen(lpMoMsg->tcMobileFrom)<=0)return 0;
	UionLinkID("消息映射到指定变量列表");
	CString strPhoneCode(lpMoMsg->tcMobileFrom);
	UionLinkID("strPhoneCode");
	UionLinkID(strPhoneCode);
	CString strMsgMo(lpMoMsg->pMessage);
	UionLinkID("strMsgMo");
	UionLinkID(strMsgMo);
	CString strSPnumber(lpMoMsg->spNumber);
	UionLinkID("strSPnumber");
	UionLinkID(strSPnumber);
	//CString LinkID(lpMoMsg->LinkID);//SGIP1.2中的作为Reserve 这8个字节分成两个4字节的INT构成。11-08
	//UionLinkID("LinkID");
	//UionLinkID(LinkID);
	CStringArray strAr;
	CString strCMD="";//命令
	CString strMsgContent="";//取出命令后的消息
	//拆出信息包,自定义一个方法,分割信息。
	strMsgMo=strMsgMo.Mid(0,lpMoMsg->iMessageLength);	
	if(_splite(strMsgMo,strAr,"@@"))
	{
		if(strAr.GetCount()>0)strCMD=strAr[0].MakeUpper();
		if(strAr.GetCount()>1){
			for(int i=1;i<strAr.GetCount();i++){
				if(strMsgContent!="")strMsgContent+=" ";
				strMsgContent+=strAr[i];
			}
		}
	}
	else{
		strCMD=strMsgMo;
		strMsgContent="";
	}
	UionLinkID("strCMD");
	UionLinkID(strCMD);
	//对命令编程序
	CString strTemp;	
	CString strContents;	
	CString strSpNumber(lpMoMsg->spNumber);	

	strContents=ReturnMsgs(strSPnumber,strCMD,"",strPhoneCode,strMsgContent);	//,LinkID
	MOMessageLog(strSPnumber+" "+strPhoneCode+"	"+strCMD);
	/*MOMessageLog();
	MOMessageLog();*/
	//MOMessageLog("//////////////////////////////////////////////");
	return 0;
}
/////////////////////////////////////////
//MO信息处理过程
UINT priGetRnd(){
	UINT temp;
	srand((unsigned)time(NULL));
	temp=UINT(rand());
	return temp;
}
static CString ReturnMsgs(CString strSPNumber,CString strCommand,CString Enterprise_Code,CString strClientPhone,CString str_Msg){//,CString LinkID
		UionLinkID("input ReturnMsgs");
	try{
		CADORecordset rs(mo_db);	
		CADORecordset rslog(mo_db);
		CString strContent;
		CTime time = CTime::GetCurrentTime();	
		CString strTZHM,strSql,strTZQS;
		CStringArray arTZHM;
		BOOL blBH=FALSE;	
		//在此处添加日志信息,表sms_log
		if(!mo_db->IsOpen())mo_db->OpenSQLServerDirect(MyReg::GetDBIP(),MyReg::GetDBUserID(),MyReg::GetDBPassword(),MyReg::GetDBName());

		//将MO信息添加到MO信息苦衷
		UionLinkID("将MO信息添加到MO信息苦衷");
		SocketTraceMO("DataInput sms_mo_input is begin");
		rs.Open("SELECT * FROM SMS_MO_INPUT WHERE 1=0");
		rs.AddNew();
		rs.SetFieldValue("SPCode",strSPNumber);
		rs.SetFieldValue("MobileCode",strClientPhone);
		rs.SetFieldValue("SMS_Msg",strCommand);		
		//rs.SetFieldValue("LINKID",LinkID);////SGIP1.2中的作为Reserve 这8个字节分成两个4字节的INT构成。11-08
		rs.Update();
		rs.Close();
		SocketTraceMO("DataInput SMS_MO_INPUT end");
		UionLinkID("将MO信息添加到MO信息苦衷 结束");

		//添加到日志表中
		UionLinkID("添加到日志表中");
		SocketTraceMO("DataInput SMS_LOG_NEW begin");
		rslog.Open("SELECT * FROM SMS_LOG_NEW WHERE 1=0");
		rslog.AddNew();
		rslog.SetFieldValue("PhoneSrc",strClientPhone);
		UionLinkID(strClientPhone);
		rslog.SetFieldValue("PhoneDesc",strSPNumber);
		UionLinkID(strSPNumber);
		//rslog.SetFieldValue("LINKID",LinkID);
		//UionLinkID(LinkID);
		rslog.SetFieldValue("SmsMsg",strCommand);	
		UionLinkID(strCommand);
		rslog.Update();
		rslog.Close();
		SocketTraceMO("DataInput SMS_LOG_NEW  end");
		UionLinkID("添加到日志表中 结束");
		return strContent;	
	}
	catch(...){
		return "";
	}
}

HRESULT CmoUniteListenWnd::OnSGIPREPORT(WPARAM wPar,LPARAM lPar)
{
	try{
		UionLinkID("状态报告 进入");
		CADORecordset rslog(mo_db);
		CString strSql="";

		SGIP_REPORT_MSG *lpReport=new SGIP_REPORT_MSG();
		lpReport=(LPSGIP_REPORT_MSG)lPar;
		CString strMobile(lpReport->UserNumber);
		byte bErrCode=0,bState=0;
		UINT MSGID=0;
		UINT KID=0;
		UINT uTimeStamp=0;
		bErrCode=lpReport->ErrorCode;
		MSGID=lpReport->RndNumber;
		KID=myConvert(MSGID);
		uTimeStamp=lpReport->TimeStamp;
		bState=lpReport->State;
		

		//在此处添加日志信息,表sms_log
		if(!mo_db->IsOpen())mo_db->OpenSQLServerDirect(MyReg::GetDBIP(),MyReg::GetDBUserID(),MyReg::GetDBPassword(),MyReg::GetDBName());
		
		strSql.Format("insert into SMS_LOG_REPORT(mobile,statue,errcode,msgid,timestamp) values('%s','%d','%d','%d','%d')",strMobile,bState,bErrCode,MSGID,uTimeStamp);
		rslog.Open(strSql);
		rslog.Close();

		SocketTraceMO(strSql);
		CString strMsg;
		strMsg.Format("timstamp:%d,mobile:%s,state:%d,errcode:%d,msgid:%d,%d",uTimeStamp,strMobile,bState,bErrCode,MSGID,KID);
		SocketTraceMO(strMsg);

		strSql.Format("update SMS_LOG_NEW SET ReportStatus='%d' Where Msg_ID='%d' and phoneDesc='%s' and pTimestamp='%d'",bErrCode,MSGID,strMobile,uTimeStamp);
		rslog.Open(strSql);
		rslog.Close();
		SocketTraceMO(strSql);
	}catch(...){

	}
	return 0;

}



static BOOL _splite(CString strSrc,CStringArray & arData,CString strFilter){
	arData.RemoveAll();
	while(!strSrc.IsEmpty()){
		int iPos = strSrc.Find(strFilter);
		if(iPos<0){
			arData.Add(strSrc);
			strSrc.Empty();
			continue;
			return false;
		}
		arData.Add(strSrc.Left(iPos));
		strSrc = strSrc.Right(strSrc.GetLength()-iPos-strFilter.GetLength());
	}
	return true;
}

// CmoUniteListenWnd message handlers

⌨️ 快捷键说明

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