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

📄 smscsocket.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 CPP
字号:
// SMSCSocket.cpp : implementation file
//

#include "stdafx.h"
#include "SMPPAgent.h"
#include "SMSCSocket.h"
#include "SMPProtocol.h"
#include "AmuseCom.h"
#include "SMPPAgentDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSMSCSocket

CSMSCSocket::CSMSCSocket(int nAppID,void* pVoid)
{
	m_nStatus = NOCONNECT;
	m_nBlock = TRUE;
	
	switch(nAppID)
	{
	case APP_SMPPROTOCOL:
		m_pcSMPProtocol = (CSMPProtocol*)pVoid;
		break;
	case APP_AMUSECOM:
		m_pcAmuseCom = (CAmuseCom*)pVoid;
		break;
	default:
		break;
	}	

	m_nAppID = nAppID;
	memset(m_szRecvMsgBuff,0,sizeof(m_szRecvMsgBuff));
	m_nRecvMsgBuffLen = 0;

	///Create();
}

CSMSCSocket::~CSMSCSocket()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSMSCSocket, CAsyncSocket)
	//{{AFX_MSG_MAP(CSMSCSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CSMSCSocket member functions

void CSMSCSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(nErrorCode != 0)
	{
		CAsyncSocket::OnReceive(nErrorCode);
		return;
	}
	char szMsgBuff[MAX_SOCKETMSG_BUFF - 500];
	int	 nRet;
	memset(szMsgBuff,0,sizeof(szMsgBuff));
	nRet = Receive(szMsgBuff,sizeof(szMsgBuff)-1);

	if(nRet == SOCKET_ERROR)
		return ;

	char szDisMsg[MAX_SOCKETMSG_BUFF - 500];
	sprintf(szDisMsg,"[接收]:%s",szMsgBuff);
	Print(szDisMsg);

	memcpy(m_szRecvMsgBuff+m_nRecvMsgBuffLen,szMsgBuff,nRet);
	
	m_nRecvMsgBuffLen += nRet;

	m_szRecvMsgBuff[m_nRecvMsgBuffLen] = '\0';

	switch(m_nAppID)
	{
	case APP_SMPPROTOCOL:
		m_nRecvMsgBuffLen = m_pcSMPProtocol->SplitRecvMsg(m_szRecvMsgBuff,m_nRecvMsgBuffLen,this);
		break;

	case APP_AMUSECOM:
		m_nRecvMsgBuffLen = m_pcAmuseCom->SplitRecvMsg(m_szRecvMsgBuff,m_nRecvMsgBuffLen);
		break;
	}

	CAsyncSocket::OnReceive(nErrorCode);
}


void CSMSCSocket::OnSend(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	if((nErrorCode == 0)&&(m_nBlock))
	{
		Print("恢复阻塞!");
		m_nBlock = FALSE;

		struSENDPACKAGE struSendPackage;
		while(!m_listSendMsgBuff.IsEmpty())
		{
			struSendPackage = m_listSendMsgBuff.RemoveHead();
			if(SMSCSendMsg(struSendPackage.szMsg,struSendPackage.nMsgLen) != 1)
				break;
			
			char szDisMsg[100];
			sprintf(szDisMsg,"阻塞发送!%d",struSendPackage.nMsgLen);
			Print(szDisMsg);
		}
	}

	CAsyncSocket::OnSend(nErrorCode);
}

void CSMSCSocket::OnConnect(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(nErrorCode == 0)
	{

		m_nStatus = CONNECTED;
	}
	
	CAsyncSocket::OnConnect(nErrorCode);
}

void CSMSCSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	if(nErrorCode == 0)
	{
		m_nStatus = NOCONNECT;	
		Close();

		switch(m_nAppID)
		{
		case APP_SMPPROTOCOL:
			m_nRecvMsgBuffLen = m_pcSMPProtocol->Print("短信中心链路被对方断开!");
			break;

		case APP_AMUSECOM:
			m_nRecvMsgBuffLen = m_pcAmuseCom->Print("游戏引擎链路被对方断开!");
			break;
		}
	}
	CAsyncSocket::OnClose(nErrorCode);
}

int CSMSCSocket::SMSConnect(char *szDestIP, int nDestPort)
{
	char szDisMsg[100];

	sprintf(szDisMsg,"建立连接到IP:%s PORT:%d",szDestIP,nDestPort);
	Print(szDisMsg);

	if(m_hSocket != 0xFFFFFFFF)
	{
		m_nStatus = NOCONNECT;
		Close();
	}

	Create();

	if(!Connect(szDestIP,nDestPort))
	{
		int nRet = GetLastError();
		if( nRet!= WSAEWOULDBLOCK)
		{			
			sprintf(szDisMsg,"SOCKET出错,错误号:%d",nRet);
			Print(szDisMsg);
			return 0;
		}
	}

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

		time(&lTimeNow);
	}

	if(m_nStatus == CONNECTED)
		Print("连接成功");
	else
	{	
		Close();
		Print("连接失败");
	}
	
	return m_nStatus;
}

int	CSMSCSocket::SMSCDisConnect()
{
	//OnClose(0);
	m_nStatus = NOCONNECT;	
	Close();

	return 1;
}

int CSMSCSocket::SMSCSendMsg(char *szSendMsg, long nMsgLength)
{
	if(m_nStatus == NOCONNECT)
		return 0;

	struSENDPACKAGE struSendPackage;

	if(m_nBlock)
	{
		memcpy(struSendPackage.szMsg,szSendMsg,nMsgLength);
		struSendPackage.nMsgLen = nMsgLength;
		m_listSendMsgBuff.AddTail(struSendPackage);
		
		Print("阻塞--写入缓存中!");
		return 2;
	}

	long nRet,nHaveSendLen = 0;	
	while(nHaveSendLen<nMsgLength)
	{	
		nRet = Send(szSendMsg+nHaveSendLen,nMsgLength-nHaveSendLen);		
		if(nRet == SOCKET_ERROR)			//如果出现错误则进入错误处理;
		{			
			if(GetLastError() == WSAEWOULDBLOCK)//如果错误原因是阻塞则置阻塞标志为TRUE;
			{				
				m_nBlock=TRUE;					

				memcpy(struSendPackage.szMsg,szSendMsg + nHaveSendLen,nMsgLength - nHaveSendLen);
				struSendPackage.nMsgLen = nMsgLength - nHaveSendLen;
				m_listSendMsgBuff.AddHead(struSendPackage);
				Print("阻塞开始!");

				return 2;
			}

			m_nStatus = NOCONNECT;
			//OnClose(0);				
			return 0;
		}
		nHaveSendLen += nRet;	
	}

	//Sleep(10);
	char szDisMsg[MAX_PACKAGE_LNE];
	sprintf(szDisMsg,"[发送]:%s",szSendMsg);
	Print(szDisMsg);

	return 1;
}

int CSMSCSocket::SMSCGetStatus()
{
	return m_nStatus;
}

int CSMSCSocket::Print(char* szPrintMsg)
{
	CSMPPAgentDlg*  pcDlg;
	pcDlg = NULL;
	pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();

	//if(m_nAppID == APP_AMUSECOM)
		//pcDlg->Display(m_nAppID+10,szPrintMsg);

	//Modify by LiuTianJun on 2001-12-24
	//if(m_nAppID == APP_SMPPROTOCOL)
		//pcDlg->Display(m_nAppID+10,szPrintMsg);

	return 0;
}

⌨️ 快捷键说明

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