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

📄 amusecom.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	time(&struMtStatus.lSendTime);
	
	//m_listMtStatus.AddTail(struMtStatus);
	
	DWORD	dwKey = struMtStatus.dwSubmitID;

	WaitForSingleObject(m_hEventMapMt,INFINITE);
	m_cmapMtStatus.SetAt(dwKey,struMtStatus);
	SetEvent(m_hEventMapMt);	

	char szDisMsg[MAX_PACKAGE_LNE];
	sprintf(szDisMsg,"向[短信中心]发送数据包: MT流水号:%-6d , 手机号:%s , 内容:%s",dwSubmitID,szDestHandset,szShortMsg);
	
	Print(szDisMsg);	

	return 1;
}

int CAmuseCom::SMPPAppProcDeliver(LPVOID lpVoid)
{
	CSMPProtocol::struSMPPSUBMIT* struSmppSubmit;

	struSmppSubmit = (CSMPProtocol::struSMPPSUBMIT*)lpVoid;
	
	char szDisMsg[MAX_PACKAGE_LNE];

	Print(" ");
	Print("==============================================================");
	//sprintf(szDisMsg,"[<===SMPP][MO]%s:%s",struSmppSubmit->szSourceAddress,
	//		struSmppSubmit->szShortMessageText);	
	sprintf(szDisMsg,"从[短信中心]收到数据包: 类型:[MO数据包] , 手机号:%s , 内容:%s",struSmppSubmit->szSourceAddress,
			struSmppSubmit->szShortMessageText);
	Print(szDisMsg);	

	AmuseSend8102(struSmppSubmit->szSourceAddress,struSmppSubmit->szDestAddress,
				  struSmppSubmit->szShortMessageText);
	
	return 1;
}

int CAmuseCom::SMPPAppProcSubmitRep(DWORD dwSubmitID,DWORD dwMessageID,DWORD dwStatus)
{
	char szDisMsg[MAX_PACKAGE_LNE];
	//sprintf(szDisMsg,"[<===SMPP][SubmitResp]SubmitID:%d Status:%d MessageID:%d",dwSubmitID,dwStatus,dwMessageID);
	sprintf(szDisMsg,"从[短信中心]收到数据包: 类型:[MT应答包] , 消息ID:%d , 状态:%d , MT流水号:%d",dwMessageID,dwStatus,dwSubmitID);
	Print(szDisMsg);

	struMTSTATUS struMtStatus,struMtRepStatus;
	/*
	POSITION pos ;
	bool	 bFlag = false;
	for (int i=0;i < m_listMtStatus.GetCount();i++)
	{
		pos = m_listMtStatus.FindIndex(i);
		struMtStatus = m_listMtStatus.GetAt(pos);
		if(struMtStatus.dwSubmitID  == dwSubmitID)
		{
			m_listMtStatus.RemoveAt(pos);
			bFlag = true;
			break;
		}
	}

	if(!bFlag)
	{
		Print("[ERROR]MT流水号匹配失败!");
		return 0;
	}*/
	WaitForSingleObject(m_hEventMapMt,INFINITE);
	if(!m_cmapMtStatus.Lookup(dwSubmitID,struMtStatus))
	{
		SetEvent(m_hEventMapMt);
		return 0;
	}
	m_cmapMtStatus.RemoveKey(dwSubmitID);
	SetEvent(m_hEventMapMt);
	
	if( (dwStatus !=0) && (dwStatus !=7) )
	{
		AmuseSend8103(struMtStatus.nAmuseID,dwStatus);
	//add by yan   ---12.3
	
		if(dwStatus == 112)
		{
			CSMPPAgentDlg*  pcDlg;
			pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();
			pcDlg->PostMessage(WM_CLOSESOCKET_USER);
			Print("主动断开与短信中心的连接!(112错误)");
			Sleep(5000);
		}		
		return 1;
	}

	struMtRepStatus.dwSubmitID = struMtStatus.dwSubmitID;
	struMtRepStatus.dwMessageID = dwMessageID;
	struMtRepStatus.nAmuseID = struMtStatus.nAmuseID;
	time(&struMtRepStatus.lSendTime);

	//m_listMtRepStatus.AddTail(struMtRepStatus);
	WaitForSingleObject(m_hEventMapMtRep,INFINITE);
	m_cmapMtRepStatus.SetAt(dwMessageID,struMtRepStatus);
	SetEvent(m_hEventMapMtRep);	

	return 1;
}

int CAmuseCom::SMPPAppProcReport(DWORD dwMessageID,DWORD dwStatus)
{
	char szDisMsg[MAX_PACKAGE_LNE];
	sprintf(szDisMsg,"从[短信中心]收到数据包: 类型:[状态报告] , 消息ID:%d , 状态:%d",dwMessageID,dwStatus);
	Print(szDisMsg);	

	struMTSTATUS struMtRepStatus;

	/*
	POSITION pos ;
	bool	 bFlag = false;
	for (int i=0;i < m_listMtRepStatus.GetCount();i++)
	{
		pos = m_listMtRepStatus.FindIndex(i);
		struMtRepStatus = m_listMtRepStatus.GetAt(pos);
		if(struMtRepStatus.dwMessageID  == dwMessageID)
		{
			m_listMtRepStatus.RemoveAt(pos);
			bFlag = true;
			break;
		}
	}

	if(!bFlag)
	{
		Print("[ERROR]消息ID匹配失败!");
		AfxMessageBox("dd");
		return 0;
	}*/

	WaitForSingleObject(m_hEventMapMtRep,INFINITE);
	if(!m_cmapMtRepStatus.Lookup(dwMessageID,struMtRepStatus))
	{
		SetEvent(m_hEventMapMtRep);	
		return 0;
	}
	m_cmapMtRepStatus.RemoveKey(dwMessageID);
	SetEvent(m_hEventMapMtRep);

	AmuseSend8103(struMtRepStatus.nAmuseID,dwStatus);
	/*if(dwStatus != 0)
	{	
		;//AmuseSend8103(struMtRepStatus.nAmuseID,dwStatus);
	}			
	*/

	return 1;
}

int CAmuseCom::AmuseTestLink()
{
	char szDisMsg[300];

	WaitForSingleObject(m_hEventMapMt,INFINITE);
	int nMtCount = m_cmapMtStatus.GetCount();
	SetEvent(m_hEventMapMt);

	sprintf(szDisMsg,"[STATUS]MT等待应答列表中的长度:%d",nMtCount);
	Print(szDisMsg);

	WaitForSingleObject(m_hEventMapMtRep,INFINITE);
	int nMtRepCount = m_cmapMtRepStatus.GetCount();
	SetEvent(m_hEventMapMtRep);

	sprintf(szDisMsg,"[STATUS]MT等待状态报告列表中的长度:%d",nMtRepCount);
	Print(szDisMsg);
	
	if(m_nAmuseStatus == NO_LOGIN_AMUSE)
	{
		if(!AmuseLogIn())
		{			
			return 0;
		}	
		return 1;		
	}

	Print("[TSTLNK]检测到游戏引擎的链路...");

	m_nAmuseTestStatus = 0;

	char szSendMsg[50];
	sprintf(szSendMsg,"5000 0 0\n");
	if(!m_pcAmuseSocket->SMSCSendMsg(szSendMsg,strlen(szSendMsg)))
	{
		m_nAmuseTestStatus = -1;				
	}

	long lTimeStart,lTimeNow;
	time(&lTimeStart);	time(&lTimeNow);
	while(((lTimeNow-lTimeStart) <= TESTLINK_TIMEOUT_SEC)&&(m_nAmuseTestStatus == 0))
	{
		MSG Msg;
		while(PeekMessage(&Msg,NULL,NULL,NULL,PM_REMOVE)) //单线程能够处理其他消息
		{
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}
		Sleep(10);

		time(&lTimeNow);
	}

	if((m_nAmuseTestStatus == 0)||(m_nAmuseTestStatus == -1))
	{
		m_nAmuseStatus = NO_LOGIN_AMUSE;
		Print("[TSTLNK][ERROR]链路被中断...重新注册");
		if(!AmuseLogIn())
			return 0;
	}

	Print("[TSTLNK]链路正常!");
	ShowStatus(APP_AMUSECOM + STAT_AMUSE_LINK,1,NULL);

	return 1;
}

int	CAmuseCom::TestLinkTwo()
{
	if(m_nProfileStat == 0)
		return 0;

	if(m_nSMPPAppStatus == NO_LOGIN_SMPPAPP)
	{
		SMPPAppLogIn();		
	}
	else
	{	
		m_pcSMPProtocol->SMPPTestLink();	
	}
	
	AmuseTestLink();
	return 1;
}

int CAmuseCom::LogInTwo()
{
	return 1;
}


UINT GetSMPPDataThread(LPVOID pParam)
{
	DWORD dwSubmitID,dwMessageID,dwStatus;
	CAmuseCom* pcAmuseCom = (CAmuseCom*)pParam;

	while(1)
	{
		CSMPProtocol::struSMPPSUBMIT struSmppSubmit;

		if(!pcAmuseCom->m_pcSMPProtocol->SMPPGetDeliver(&struSmppSubmit))
			pcAmuseCom->SMPPAppProcDeliver((LPVOID)&struSmppSubmit);

		if(!pcAmuseCom->m_pcSMPProtocol->SMPPGetSubmitRep(&dwSubmitID,&dwMessageID,&dwStatus))
			pcAmuseCom->SMPPAppProcSubmitRep(dwSubmitID,dwMessageID,dwStatus);

		if(!pcAmuseCom->m_pcSMPProtocol->SMPPGetStatReport(&dwMessageID,&dwStatus))
			pcAmuseCom->SMPPAppProcReport(dwMessageID,dwStatus);

		Sleep(5);
	}
	return 1;
}

int CAmuseCom::SMPPAppLogIn()
{
	char szSMPPIP[30],szSystemID[30],szPassword[30],szSystemType[30];
	int  nSMPPort;

	if(!GetPrivateProfileString(m_szDestSMSCKey, "IP", NULL, 
			szSMPPIP, sizeof(szSMPPIP),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"IP");
		return 0;
	}

	nSMPPort = GetPrivateProfileInt(m_szDestSMSCKey, "PORT", 0,PROFILE_NAME);
	if(nSMPPort == 0)
	{
		ProfileErr(m_szDestSMSCKey,"PORT");
		return 0;
	}

	if(!GetPrivateProfileString(m_szDestSMSCKey, "System_id", NULL, 
			szSystemID, sizeof(szSystemID),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"System_id");
		return 0;
	}

	if(!GetPrivateProfileString(m_szDestSMSCKey, "Password", NULL, 
			szPassword, sizeof(szPassword),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"Password");
		return 0;
	}	

	if(szPassword[0] == 0x20)
		szPassword[0] = 0x00;
	
	if(!GetPrivateProfileString(m_szDestSMSCKey, "System_type", NULL, 
			szSystemType, sizeof(szSystemType),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"System_type");
		return 0;
	}
	
	//add by yan     ------12.3
	int g_n112DelayTime = GetPrivateProfileInt(m_szDestSMSCKey, "DELAYTIME", 0,PROFILE_NAME);
	
	CSMPProtocol::struSMPPLOGIN struSmppLogIn;
	memset(&struSmppLogIn,0,sizeof(struSmppLogIn));
	strcpy(struSmppLogIn.szSystemID,szSystemID);
	strcpy(struSmppLogIn.szPassword,szPassword);
	strcpy(struSmppLogIn.szSystemType,szSystemType);
	struSmppLogIn.nTON = BYTE(2);
	struSmppLogIn.nPI = BYTE(1);

	if(m_pcSMPProtocol->SMPPLogIn(szSMPPIP,nSMPPort,struSmppLogIn))
	{
		return 0;
	}

	m_nSMPPAppStatus = LOG_SMPPAPP_SUCCESS;	
		
	//启动线程;
	AfxBeginThread(GetSMPPDataThread,this,THREAD_PRIORITY_NORMAL);

	return 1;
}


int CAmuseCom::Print(char* szPrintMsg)
{
	//m_pcDlg->PostMessage(WM_DISPLAY_MSG,APP_AMUSECOM,(LPARAM)szPrintMsg);
	m_pcDlg->Display(APP_AMUSECOM,szPrintMsg);
	return 1;
}

int CAmuseCom::ShowStatus(int nType,int nValue,char* szMsg)
{
	CSMPPAgentDlg*  pcDlg;
	pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();

	m_pcDlg->ShowStatus(nType,nValue,szMsg);

	return 1;
}

int CAmuseCom::ProfileErr(char* szSection,char* szKey)
{
	char szMsg[300];

	m_pcDlg->KillTimer(2);
	
	sprintf(szMsg,"读取配置文件出错--节名: [%s] , 关健字: [%s]\n\n请检查配置文件!",szSection,szKey);
	m_pcDlg->MessageBox(szMsg,"出错提示",MB_ICONSTOP);

	m_pcDlg->Exit(1);

	return 1;
}

int	CAmuseCom::SendAmuseBuff()
{
	int	nSendAmuseSeq;
	struSENDAMUSE struSendAmuse;
	long lNowTime;

	WaitForSingleObject(m_hEventMapSendAmuse,INFINITE);

	POSITION pos = m_cmapSendAmuse.GetStartPosition();
	while(pos != NULL)
	{
		m_cmapSendAmuse.GetNextAssoc(pos,nSendAmuseSeq,struSendAmuse);
		if(struSendAmuse.nSendCount == 3)
			m_cmapSendAmuse.RemoveKey(nSendAmuseSeq);

		time(&lNowTime);
		if((lNowTime - struSendAmuse.lSendTime)>= RESEND_INTERVAL)
		{
			char szDisMsg[MAX_PACKAGE_LNE];

			sprintf(szDisMsg,"向[游戏引擎]发送数据包: 类型:[8102重发] , 内容:%s",struSendAmuse.szMsg);
			Print(szDisMsg);

			if((m_nAmuseStatus != LOG_AMUSE_SUCCESS)||
				(!m_pcAmuseSocket->SMSCSendMsg(struSendAmuse.szMsg,strlen(struSendAmuse.szMsg))))
			{
				m_cmapSendAmuse.RemoveKey(nSendAmuseSeq);				
				break;
			}
		}
		struSendAmuse.nSendCount++;
		m_cmapSendAmuse.SetAt(nSendAmuseSeq,struSendAmuse);
	}

	SetEvent(m_hEventMapSendAmuse);

	//Modify by LiuTianJun on 2001-12-28
	WaitForSingleObject(m_hEventMapMtRep,INFINITE);
	if(m_cmapMtRepStatus.GetCount()>5000)
		m_cmapMtRepStatus.RemoveAll();
	SetEvent(m_hEventMapMtRep);	
	
	return 1;
}

⌨️ 快捷键说明

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